该函数glVertexAttribPointer
指定渲染某些东西(即下一次glDraw...
调用)时使用的顶点属性的格式和源缓冲区(忽略客户端数组的不推荐使用)。
现在有两种情况。您要么使用顶点数组对象 (VAO),要么不使用(尽管在现代 OpenGL 中不推荐使用和不鼓励/禁止使用 VAO)。如果您不使用 VAO,那么您通常会在渲染之前调用glVertexAttribPointer
(和相应的glEnableVertexAttribArray
)以正确设置状态。但是,如果使用 VAO,您实际上会在 VAO 创建代码(通常是某些初始化或对象创建的一部分)中调用它(和启用函数),因为它的设置存储在 VAO 中,渲染时您需要做的就是绑定 VAO 并调用绘图函数。
但是无论何时调用glVertexAttribPointer
,都应在之前绑定相应的缓冲区(无论何时实际创建和填充),因为该glVertexAttribPointer
函数将当前绑定的设置GL_ARRAY_BUFFER
为此属性的源缓冲区(并存储此设置,因此之后您可以自由绑定另一个 VBO)。
因此,在使用 VAO(推荐)的现代 OpenGL 中,它通常类似于以下工作流程:
//initialization
glGenVertexArrays
glBindVertexArray
glGenBuffers
glBindBuffer
glBufferData
glVertexAttribPointer
glEnableVertexAttribArray
glBindVertexArray(0)
glDeleteBuffers //you can already delete it after the VAO is unbound, since the
//VAO still references it, keeping it alive (see comments below).
...
//rendering
glBindVertexArray
glDrawWhatever
当不使用 VAO 时,它会是这样的:
//initialization
glGenBuffers
glBindBuffer
glBufferData
...
//rendering
glBindBuffer
glVertexAttribPointer
glEnableVertexAttribArray
glDrawWhatever