有没有人能推荐一份学习OpenGL 3.2核心配置文件的指南?
SDK难以阅读,我看过的大多数指南都只教授旧的方法。
我不知道有什么好的指南,但我可以给你一个快速总结。
我会假设你已经熟悉着色器、顶点缓冲区等基础概念。如果你还不了解这些,我建议你先阅读一份关于着色器的指南,因为所有的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
创建着色器,使用glShaderSource
设置它们的GLSL源代码,并使用glCompileShader
来编译它们。你可以使用glGetShaderiv(shader, GL_COMPILE_STATUS, &out)
来检查是否成功,并使用glGetShaderInfoLog
检索错误消息。
使用glCreateProgram
创建程序(即绑定在一起的一组着色器,通常包括一个顶点着色器和一个片段着色器),然后使用glAttachShader
绑定要使用的着色器,最后使用glLinkProgram
来链接程序;就像着色器一样,你可以使用glGetProgram
和glGetProgramInfoLog
来检查链接是否成功。
当你想绘制时:
使用glBindBuffer
方法,分别将顶点缓冲区和索引缓冲区绑定到GL_ARRAY_BUFFER
和GL_ELEMENT_ARRAY_BUFFER
参数上。
使用glUseProgram
将程序绑定
现在,对于着色器中的每个varying变量,您需要调用glVertexAttribPointer
函数,其语法类似于传统的glVertexPointer
、glColorPointer
等函数,但其第一个参数是varying的标识符;这个标识符可以通过调用已链接的程序的glGetAttribLocation
函数来获取
对于着色器中的每个uniform变量,您需要调用glUniform
函数;它的第一个参数是uniform变量的位置(也是一种标识符),您可以通过调用glGetUniformLocation
函数来获取该位置(注意:如果您有一个名为“a”的数组,则必须用“a[0]”调用该函数)
对于要绑定的每个纹理,您需要使用glActiveTexture
函数并指定GL_TEXTUREi
(i对于每个纹理不同),然后调用glBindTexture
函数,并将uniform变量的值设置为i
调用glDrawElements
函数
这些是您必须做的基本操作。当然还有其他内容,例如顶点数组对象、uniform缓冲区等,但它们仅用于优化目的
其他领域,如裁剪、混合、视口等,在较旧版本的OpenGL中基本保持不变
我还建议您学习这个演示程序(它使用顶点数组对象)。最有趣的文件是main.cpp
希望这可以帮助您