OpenGL 3.2 核心配置文件指南

8

有没有人能推荐一份学习OpenGL 3.2核心配置文件的指南?

SDK难以阅读,我看过的大多数指南都只教授旧的方法。

1个回答

29

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

我会假设你已经熟悉着色器、顶点缓冲区等基础概念。如果你还不了解这些,我建议你先阅读一份关于着色器的指南,因为所有的OpenGL 3都是基于着色器使用的。

初始化:

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

  • 对于索引缓冲区也是一样,只是你需要用GL_ELEMENT_ARRAY_BUFFER代替GL_ARRAY_BUFFER

  • 像在以前的OpenGL版本中一样,创建纹理(glGenTexturesglBindTextureglTexImage2D)。

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

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

当你想绘制时:

  • 使用glBindBuffer方法,分别将顶点缓冲区和索引缓冲区绑定到GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER参数上。

  • 使用glUseProgram将程序绑定

  • 现在,对于着色器中的每个varying变量,您需要调用glVertexAttribPointer函数,其语法类似于传统的glVertexPointerglColorPointer等函数,但其第一个参数是varying的标识符;这个标识符可以通过调用已链接的程序的glGetAttribLocation函数来获取

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

  • 对于要绑定的每个纹理,您需要使用glActiveTexture函数并指定GL_TEXTUREi(i对于每个纹理不同),然后调用glBindTexture函数,并将uniform变量的值设置为i

  • 调用glDrawElements函数

  • 这些是您必须做的基本操作。当然还有其他内容,例如顶点数组对象、uniform缓冲区等,但它们仅用于优化目的

    其他领域,如裁剪、混合、视口等,在较旧版本的OpenGL中基本保持不变

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

    希望这可以帮助您


    这是我最近看到的关于现代OpenGL(核心3.2+)的较好的“简短摘要”之一。如果你正在从1.x/2.x转向新的教程,它可能会更有意义。作为思维导图也很不错。 - Aktau
    2
    有一件事让我困扰,那就是你必须使用VAO和VBO来绘制。否则,在调用glVertexAttribPointer时会出现GL_INVALID_OPERATION错误。至少在Mac OS X上是这样的情况。 - YRH

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接