8

任何人都可以建议学习 OpenGL 3.2 核心配置文件的指南吗?

SDK很难阅读,而且我看到的大多数指南都只教授旧方法。

4

1 回答 1

28

我不知道有什么好的指南,但我可以给你一个快速的总结

我假设您已经熟悉着色器、顶点缓冲区等的基础知识。如果您不熟悉,我建议您先阅读有关着色器的指南,因为所有 OpenGL 3 都是基于着色器的使用

初始化时:

  • glGenBuffers使用和创建并填充顶点glBindBuffer(GL_ARRAY_BUFFER, bufferID)缓冲区glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW)

  • 索引缓冲区相同,除了您使用GL_ELEMENT_ARRAY_BUFFER而不是GL_ARRAY_BUFFER

  • 像在以前版本的 OpenGL ( glGenTextures, glBindTexture, glTexImage2D)中一样创建纹理

  • 使用 创建着色器glCreateShader,使用 设置它们的 GLSL 源代码,并使用;glShaderSource编译它们 glCompileShader您可以检查它是否成功glGetShaderiv(shader, GL_COMPILE_STATUS, &out)并使用检索错误消息glGetShaderInfoLog

  • 使用 来创建程序(即一组绑定在一起的着色器,通常是一个顶点着色器和一个片段着色器)glCreateProgram,然后绑定您想要使用的着色器glAttachShader,然后使用;链接程序。glLinkProgram就像着色器一样,您可以检查链接是否glGetProgram成功glGetProgramInfoLog

当你想画画时:

  • 分别使用glBindBufferwith 参数GL_ARRAY_BUFFER和绑定顶点和索引缓冲区GL_ELEMENT_ARRAY_BUFFER

  • 程序与glUseProgram

  • 现在对于着色器中的每个可变变量,您必须调用glVertexAttribPointer其语法类似于传统glVertexPointer的 ,glColorPointer等函数,除了它的第一个参数是可变的标识符;可以通过调用glGetAttribLocation链接程序来检索此标识符

  • 对于着色器中的每个统一变量,您必须调用glUniform; 它的第一个参数是统一变量的位置(也是一种标识符),您可以通过调用来检索它glGetUniformLocation(警告:如果您有一个名为“a”的数组,则必须使用“a [0]”调用该函数)

  • 对于要绑定的每个纹理,您必须调用glActiveTexturewith GL_TEXTUREi(每个纹理的 i 不同),然后glBindTexture将制服的值设置为 i

  • 称呼glDrawElements

这是你必须做的基本事情。当然还有其他东西,比如顶点数组对象、统一缓冲区等,但它们仅用于优化目的

其他领域,如剔除、混合、视口等,与旧版本的 OpenGL 基本相同

我还建议您研究这个演示程序(它使用顶点数组对象)。最有趣的文件是 main.cpp

希望这可以帮助

于 2010-09-19T20:28:04.837 回答