As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




7年前关闭。




谁能建议学习OpenGL 3.2核心配置文件的指南?

SDK很难阅读,我所见的大多数指南都只讲授了旧方法。

最佳答案

我没有任何好的指导,但我可以为您提供快速摘要

我假设您已经熟悉了着色器,顶点缓冲区等基础知识。如果不熟悉,建议您先阅读有关着色器的指南,因为所有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创建程序(即,一组绑定(bind)在一起的着色器,通常是一个顶点着色器和一个片段着色器),然后使用glAttachShader绑定(bind)所需的着色器,然后使用glLinkProgram链接程序;就像着色器一样,您可以检查与glGetProgramglGetProgramInfoLog
  • 的链接成功

    当您要绘制时:
  • 使用glBindBuffer和参数GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER分别绑定(bind)顶点和索引缓冲区
  • glUseProgram绑定(bind)程序
  • 现在,对于着色器中的每个可变变量,您都必须调用glVertexAttribPointer,其语法与旧版glVertexPointerglColorPointer等函数相似,不同之处在于它的第一个参数是可变变量的标识符。可以通过在链接程序
  • 上调用glGetAttribLocation来检索此标识符
  • 对于着色器中的每个统一变量,您必须调用glUniform;它的第一个参数是统一变量的位置(也是一种标识符),您可以通过调用glGetUniformLocation(警告:如果您有一个名为“a”的数组,则必须使用“a [0]”来调用该函数) “)
  • 对于要绑定(bind)的每个纹理,必须使用glActiveTexture调用GL_TEXTUREi(每个纹理我都不同),然后调用glBindTexture,然后将制服的值设置为i
  • 调用glDrawElements

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

    其他域(例如剔除,混合,视口(viewport)等)与旧版OpenGL大致相同

    我还建议您研究this demo program(使用顶点数组对象)。最有趣的文件是main.cpp

    希望这可以帮助

    09-04 15:31