初学OpenGL及其弃用问题

5 投票
3 回答
1485 浏览
提问于 2025-04-15 18:06

我开始用 Python 的 PyOpenGL 3.0.1b 玩 OpenGL。

我看了一些示例代码,开始运行和修改它们,一切都挺顺利,直到我对这些东西了解得稍微多了一点。

http://pyopengl.sourceforge.net/documentation/manual-3.0/index.xhtml 上,有列出 OpenGL 的函数,以及哪些函数已经过时了。所以我心想,得找一些不使用这些过时内容的最新教程。

几个小时过去了,还是没找到!一堆一堆的过时示例代码……有没有地方可以找到不含过时内容的教程呢?

3 个回答

2

我建议学习的方式是从一个固定功能的程序开始,慢慢地把它变成核心配置的程序,每次添加一点点。基本上,你需要解决三个主要问题,遗憾的是这三个问题都比较复杂,而且彼此关联,如果你屏幕上什么都不显示,你就不知道哪个部分出了问题。不过,只要你按照正确的方法来做,应该没问题。

首先,学习顶点缓冲对象(Vertex Buffer Objects)和顶点数组对象(Vertex Array Object)。也就是要放弃使用 glBegin、glEnd、glVertex3f、glColor4f、glNormal3f、glTexCoord2f 等这些函数。

接下来,学习手动矩阵变换,放弃使用 glRotatef、glTranslate、glPushMatrix、glPopMatrix、glMatrixMode、glLoadIdentity、GL_PROJECTION、GL_MODELVIEW、glFrustum、glOrtho、gluLookAt、gluPerspective、gluOrtho2。我推荐看看 glm,这是 OpenGL 网站在他们的 SDK 中提到的库。在你仍然使用固定功能组件的非核心配置时,你可以用 glLoadMatrixf 手动加载矩阵,之后你需要把矩阵绑定到着色器上。

然后,学习基本的 GLSL 着色器。虽然有一些过时的函数像 gl_vertex、gl_normal 和 ftransform() 仍然可以和 VBO 一起使用,但你可以在完全设置好着色器绑定之前继续使用它们。

接下来,进行所有的着色器绑定,使用顶点属性代替固定的 gl_vertex 和 gl_position。使用 uniform 来上传模型视图和投影矩阵,而不是使用 ftransform(),还包括灯光和材质属性(我通常会上传模型视图投影矩阵,而不是单独上传投影矩阵,这样着色器每次计算时就不会重复计算)。

最后,使用核心配置,你需要一个支持创建核心配置的窗口工具包。GLUT 和 GLFW 都支持,而 SMFL 不支持。SDL 1.3-dev 支持,但我觉得 pygame 不支持,遗憾的是。核心配置会去掉任何过时的功能。

3

感谢 Jason L. McKesson

这里有一些没有过时代码的精彩示例和教程(适用于 OpenGL 3.3)

http://www.arcsynthesis.org/gltut/index.html

还有另一个没有太多解释的教程(适用于 OpenGL 4.x 和 3.3)

http://openglbook.com/the-book/

2

OpenGL ES 2.0 实际上和 OpenGL 3 很相似,只是去掉了一些功能,比如多个渲染目标和一些着色器指令等。关于 OpenGL ES 2.0 的编程指南书里有一些教程和源代码可以下载,这些可以帮助你入门 OpenGL 3.0。大部分在 ES 2.0 中能编译的代码,在更新的 OpenGL 版本中也能编译通过。你也可以在网上搜索 ES 2.0 的教程。

我还推荐你看看我正在开发的图形引擎(OpenREng)。你可以查看 OpenGL 的封装类,了解在更新版本中支持的大部分功能。

撰写回答