OpenGL核心和兼容性

use*_*820 9 c c++ opengl glsl

我正在尝试学习OpenGL.我有使用C和C++的经验,建立一个构建环境,以及所有爵士乐,但我正在努力找到一个好的起点.

我知道在OpenGL <= 2.1中突出的固定功能管道,并且它似乎相对容易上手.但是,OpenGL在OpenGL> = 3.1中推送的核心配置文件让我想要因弃用而远离FFP.但我很困惑它在3.1及以上的工作原理.在2.1及以下,当你绘制形状时,你有glBegin(GL_WHATEVER)和glEnd().在查看核心配置文件API时,我注意到的第一件事是这两个函数调用已经消失.我意识到这可能是一个简单的替代品,但看到这样一个(看似有用的)从这样一个基本任务中取出来是非常令人震惊的.它几乎似乎是从c标准库中弃用printf().当我使用最新的红皮书时,他们仍然使用旧的弃用代码,这进一步混淆了我的想法.

在阅读类似问题的各种答案时,我看到典型的"基于着色器"或"它都是用着色器完成的"等等.如果我想在黑色背景上绘制一个简单的白色方块(最新红皮书中的第一个例子) ,我不明白着色器是如何与绘制盒子相关的.他们不应该......嗯..阴影?我已经开始考虑购买橙皮书和蓝皮书了,但是我不想再把钱花在一些隐藏在图书馆(蓝皮书)背后的东西上,或者想要讨论一个着色器编程的东西在3D环境中执行某些照明任务(橙皮书).

那么我从哪里开始呢?如何使用除核心配置文件之外的任何内容绘制一个框(或多维数据集或金字塔或其他).我不是在这里要求代码片段,我正在寻找一个广泛的教程或书籍或某人可以指向我的东西.如果以前已经回答过,而我没有找到,请重定向我.

The*_*Saw 14

核心配置文件中突然出现"复杂性"的原因是固定功能管道并不能代表GPU实际为您所做的工作.大部分功能都是在CPU上完成的,只有实际绘图才在GPU上完成.固定管道的另一个问题是它是一场失败的战斗.固定管道有很多旋钮和开关!因此,它不仅已经非常复杂,它将永远无法满足绘制场景的新方式的无尽需求.输入GLSL,您就可以准确地告诉GPU如何绘制场景.这将权力转移给了开发人员,使每个人都不必等待新的交换机/旋钮的OpenGL更新.

现在,关于你对突然失去glBegin和glEnd的沮丧......有一些简单的框架模仿他们在新核心配置文件上的行为,这是一件好事.同样,它将权力转移给开发人员,以选择他们如何接近管道.但是,在FFP上练习3D并没有错.无论如何,您首先需要学习3D数学和概念.无论API如何,这些概念都适用.(矩阵数学将在OpenGL和Direct3D中保存您的生命.)因此,首先您使用简单的三角形和颜色进行练习.然后你移动到纹理(纹理坐标).然后添加法线(带照明).然后,在理解了所有这些概念之后,停止使用glBegin/glEnd,并开始将大量顶点数据批处理到缓冲区中.如果你不理解glBegin/glEnd,你就不会理解glDrawElements.所以,可以学习这些工具.