我正在尝试学习OpenGL。我有使用C和C ++的经验,建立一个构建环境,以及所有爵士乐,但我正在努力找到一个好的起点。
我知道在OpenGL< = 2.1中突出的固定功能管道,它似乎相对容易上手。但是,OpenGL在OpenGL> = 3.1中推送的核心配置文件让我想要因弃用而远离FFP。但我很困惑它在3.1及以上的工作原理。在2.1及以下,当你绘制形状时,你有glBegin(GL_WHATEVER)和glEnd()。在查看核心配置文件API时,我注意到的第一件事是这两个函数调用已经消失。我意识到这可能是一个简单的替代品,但看到这样一个(看似有用的)从这样一个基本任务中取出来是非常令人震惊的。它几乎似乎是从c标准库中弃用printf()。当我使用最新的红皮书时,他们仍然使用旧的弃用代码,这进一步混淆了我的想法。
当阅读类似问题的各种答案时,我看到典型的“基于着色器”或“它都是用着色器完成的”等等。如果我想在黑色背景上绘制一个简单的白色方块(最新的第一个例子)红皮书),我不明白着色器是如何与绘制盒子相关的。他们不应该......嗯..阴影?我已经开始考虑购买橙皮书和蓝皮书了,但是我不想再把钱花在一些隐藏在图书馆(蓝皮书)背后的东西上,或者想要讨论一个着色器编程的东西在3D环境中执行某些照明任务(橙皮书)。
那我从哪里开始呢?如何使用除核心配置文件之外的任何内容绘制一个框(或多维数据集或金字塔或其他)。我不是在这里要求代码片段,我正在寻找一个广泛的教程或书籍或某人可以指向我的东西。如果以前已经回答过这个问题而我没有找到,请重定向我。
答案 0 :(得分:14)
核心配置文件中突然出现“复杂性”的原因是固定功能管道并不能代表GPU实际为您做的事情。大部分功能都是在CPU上完成的,只有实际绘图才在GPU上完成。固定管道的另一个问题是它是一场失败的战斗。固定管道有很多旋钮和开关!因此,它不仅已经非常复杂,它将永远无法满足绘制场景的新方式的无尽需求。输入GLSL,您就可以准确地告诉GPU如何绘制场景。这会将功能转移给开发人员,让每个人都不必等待新的开关/旋钮的OpenGL更新。
现在,关于你对突然失去glBegin和glEnd的沮丧......有一些简单的框架模仿他们在新核心配置文件上的行为,这是一件好事。同样,它将权力转移给开发人员,以选择他们如何接近管道。但是,在FFP上练习3D并没有错。无论如何,您首先需要学习3D数学和概念。无论API如何,这些概念都适用。 (矩阵数学将在OpenGL和Direct3D中保存您的生命。)因此,首先您使用简单的三角形和颜色进行练习。然后你移动到纹理(纹理坐标)。然后添加法线(带照明)。然后,在理解了所有这些概念之后,停止使用glBegin / glEnd,并开始将大量顶点数据批处理到缓冲区中。如果你不理解glBegin / glEnd,你就不会理解glDrawElements。所以,可以学习这些工具。