我会说 OpenGL 3.1 是现代的 OpenGL。
任何支持 OpenGL 3.1 的硬件都能够支持 OpenGL 3.3。驱动程序是否始终支持它是另一回事。更新你的显卡可能会让你升级到 OpenGL 3.3。
为了澄清这一点,OpenGL 3.1 不是旧版 OpenGL。
旧版 OpenGL 将是:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(90.0, 0.0, 1.0, 0.0);
glTranslatef(0.0, 0.0, -5.0);
具有兼容性上下文的 OpenGL 3.1 支持哪个,但这并不意味着应该使用它。如果您正在为支持 OpenGL 3 的硬件进行开发,您绝对不应该使用它。您可以通过请求核心上下文来禁用旧版功能。
如果您正在使用着色器,那么您已经移除了传统的固定功能管道。所以 GLSL 130 不是遗留的:P.
使用我的英特尔 CPU 在我的 Linux 笔记本电脑上工作,其中最新的稳定驱动程序仅在 OpenGL 3.1(是的 OpenGL 3.3 提交已经到位,但我正在等待 MESA 10 ;))我已经毫不费力地能够无需接触旧版 OpenGL,即可在我的机器上运行 OpenGL 3.3 教程。
OpenGL 的一大优点是您可以使用 OpenGL 扩展来扩展功能。即使您的硬件无法处理 OpenGL 4.4,您仍然可以使用不需要 OpenGL 4 硬件和更新驱动程序的扩展!
请参阅https://developer.nvidia.com/opengl-driver 和http://developer.amd.com/resources/documentation-articles/opengl-zone/,了解有关旧硬件添加了哪些功能的信息,但如果您不确定,您只需在您的硬件上进行测试即可。
最后我会说 Legacy OpenGL 也有它的位置。
在我看来,传统 OpenGL 可能比现代 OpenGL 更容易学习,因为您不需要着色器和 OpenGL 缓冲区的知识来绘制您的第一个三角形,但我认为您不应该在现代生产中使用它应用。
如果您需要对旧硬件的支持,您可能需要使用旧的 OpenGL 版本。即使是现代 CPU 也支持 OpenGL 3,所以我不会太担心这一点。
从 OpenGL 3.3 转换到 OpenGL 3.0
我在http://www.opengl-tutorial.org/ 的教程中对其进行了测试。我不能把我转换的代码放上去,因为大部分都是教程中的,我没有权限把代码放在这里。
他们的作者谈到了 OpenGL 3.1,但由于他的上限为 glsl 130 (OpenGL 3.0),我正在转换为 3.0。
首先将上下文版本更改为 OpenGL 3.0(只需更改
如果您从教程中工作,则次要版本为 0)。如果您使用 OpenGL 3.0,也不要将其设置为使用核心上下文,因为据我所知 ARB_compatibility 仅适用于 OpenGL 3.1。
-
将着色器版本更改为
#version 130
-
删除着色器中的所有布局绑定
layout(location = #) in vec2 #myVarName;
到
in vec2 #myVarName;
-
使用 glBindAttribLocation 绑定指定的 in 布局(参见 3)
例如
glBindAttribLocation(#myProgramName, #, "#myVarName");
-
使用glBindFragDataLocation 绑定指定的输出布局(参见3)
例如
glBindFragDataLocation(#myProgramName, #, "#myVarName");
glFramebufferTexture 在 OpenGL 3.0 中不起作用。 (用于阴影贴图和延迟渲染等)。相反,您需要使用glFramebufferTexture2D。 (它有一个额外的参数,但文档就足够了)
这里是tutorial16的截图(我虽然这个涵盖了大部分领域,并用这个测试看看是否需要所有这些)
tutorial16 的来源有误(在撰写本文时)。 FBO 设置为没有颜色输出,但片段着色器仍然输出颜色值,导致段错误(尝试写入任何内容通常会这样做)。只需将深度片段着色器更改为不输出任何内容即可修复它。 (不会对更宽容的驱动程序产生段错误,但这不是你应该讨价还价的东西)