OpenGL 核心和兼容性

OpenGL Core and Compatibility

本文关键字:兼容性 核心 OpenGL      更新时间:2023-10-16

我正在尝试学习OpenGL。 我有 C 和 C++、设置构建环境以及所有这些爵士乐的经验,但我正在努力找出一个好的起点。

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

在阅读类似问题的各种答案时,我看到了典型的"基于着色器"或"这一切都是用着色器完成的"等。 如果我想在黑色背景上绘制一个简单的白色方块(最新红皮书中的第一个示例),我根本不明白着色器与绘制框有什么关系。 他们不应该这样做吗...井。。描影法? 我已经考虑过购买橙皮书和蓝皮书,但我不想再花钱买一些会把一切都藏在图书馆后面的东西(蓝皮书)或者谈论编程着色器以在3D环境中执行一些光照任务的东西(橙皮书)。

那么我从哪里开始呢? 我如何只使用核心轮廓绘制一个盒子(或立方体或金字塔或其他任何东西)。 我在这里不要求代码片段,我正在寻找一个广泛的教程或一本书或有人可以指出我的东西。 如果之前已经回答过这个问题,但我没有找到它,请重定向我。

核心配置文件中突然"复杂"的原因是,固定的功能管道并不能代表GPU实际为您做什么。大部分功能是在 CPU 上完成的,只有实际的绘制发生在 GPU 上。固定管道的另一个问题是这是一场失败的战斗。固定管道有很多旋钮和开关!因此,它不仅已经非常复杂,而且永远无法跟上对绘制场景的新方法的无休止的需求。输入 GLSL,您就可以准确地告诉 GPU 您想要如何绘制场景。这将权力转移给开发人员,使每个人都不必等待OpenGL更新以获取新的开关/旋钮。

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