c++ - glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
问题描述
这是一个示例代码:-
unsigned int instanceVBO;
glGenBuffers(1, &instanceVBO);
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glBindVertexArray(VAO);
...
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec2) * 100,
&translations[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
... ... ...
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexAttribDivisor(2, 1); //<--- who own this setting?
//^ mostly copied from https://learnopengl.com/Advanced-OpenGL/Instancing
谁拥有glVertexAttribDivisor
设置?(VAO / instanceVBO / 全局状态)
https://gamedev.stackexchange.com/questions/99236/what-state-is-stored-in-an-opengl-vertex-array-object-vao-and-how-do-i-use-the中的评论#comment174555_99238 建议它存储在 VBO 中。
但是,该注释与上述在unbindsglVertexAttribDivisor(2, 1)
之后glBindBuffer(GL_ARRAY_BUFFER, 0);
调用的代码相矛盾 (?) 。
如果您也愿意提供参考,我将不胜感激:
Opengl 的哪个事物(VAO/VBO/等)拥有哪些设置/状态。
解决方案
顶点数组除数 ( VERTEX BINDING DIVISOR
) 存储在顶点数组对象状态向量中,分别用于每个顶点属性(如启用状态、偏移量、步幅等)。
存储在 VAO 中的状态列在表 23.3:顶点数组对象状态的规范中。
VAO 在OpenGL 4.6 API Core Profile Specification - 10.3.1 Vertex Array Objects中指定。
另请参见顶点规范 - 实例化数组