我正在研究一个OpenGL 2.0渲染器(https://bitbucket.org/mattiascibien/anima-render),我实际上遇到了一些我根本无法理解的东西,这是 glVertexPointer()指令的步幅。实际上我的代码看起来像这样
glBindBuffer(GL_ARRAY_BUFFER, data.vertex_buffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(
3,
GL_FLOAT,
sizeof(GLfloat)*3,
(void*)0
);
但我实际上发现通过阅读OpenGL文档,步幅实际上应为0.更改它不会改变模型的呈现方式。
什么价值是正确的?为什么更改此参数没有区别?
编辑:数据存储在
中std::vector<GLFloat>
使用sizeof(GLfloat)* 2或0 的glTexCoordPointer也会发生同样的情况
答案 0 :(得分:2)
https://www.opengl.org/sdk/docs/man2/xhtml/glInterleavedArrays.xml提供更多信息。
如果stride为0,则连续存储聚合元素。否则,在一个聚合数组元素的开头和下一个聚合数组元素的开头之间出现跨步字节。
当你提供一个步幅时,即0
或你的“struct”大小(3 * sizeof(GLFloat)),这是相同的。然而,在这种情况下,我会选择0。
答案 1 :(得分:1)
Stride是从一个实体的开头到下一个实体的开头的距离。 0是特殊的:它表示从一个实体的 end 到下一个实体的开头的距离为0.因此,0基本上与sizeof(entity)相同。
基本上他们在一个参数中包含了两种不同的机制,我认为这种机制不是最理想的。