2010-09-19 87 views

回答

28

我不知道有什么好的指导,但我可以让你快速摘要

我会假设你如果不这样做已经很熟悉着色器,顶点缓冲区等的基本知识,我建议你读了有关着色器第一导而是因为所有的OpenGL 3是基于着色器

在初始化的用法:

  • 创建和使用glGenBuffersglBindBuffer(GL_ARRAY_BUFFER, bufferID)和填充顶点缓冲区

  • 同为索引缓冲区,除非你使用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

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

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

  • 对于要绑定每个纹理,你必须调用glActiveTextureGL_TEXTUREi(i是对每个纹理不同),然后glBindTexture然后均匀的值设置为我

  • 呼叫glDrawElements

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

其他域像剔除,混合,视口等仍然大部分与旧版本的OpenGL相同

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

希望这可以帮助

+0

一个更好的现代的OpenGL(核心3.2+)“的简短总结:”我在一段时间看到的。从1.x/2.x开始,尝试通过更新的教程获得最新信息可能会更有意义。作为思维导图很好。 – Aktau 2013-08-28 14:51:39

+2

绊倒我的一件事是,你必须使用VAO和VBO来绘制。否则,在调用glVertexAttribPointer时会得到GL_INVALID_OPERATION。至少在Mac OS X上就是这种情况。 – YRH 2013-10-25 12:40:35