我正在制作这个需要渲染彩色四边形的程序。 为此,我正在使用 VBO。
这就是我存储顶点和颜色数据的方式:
渲染四边形:
buff.put(3 floats color)
render the quad (3 floats per vertex * 4 per face * 6 per quad)
现在如您所见,我的目标是使用交错的 VBO,但我不知道步幅和偏移量。
这是我在渲染时的调用:
(注意我使用的是映射的 vbos,这就是没有实际数据绑定(bind)的原因):
glBindBufferARB(GL_ARRAY_BUFFER_ARB, etn.getVboHandel());
glBufferDataARB(GL_ARRAY_BUFFER_ARB, etn.getVboData().capacity() << 2, GL_STATIC_DRAW_ARB);
glColorPointer(3, GL_FLOAT, /* stride **/6 << 2, /* offset **/0);
glVertexPointer(3, GL_FLOAT, /* stride **/6 << 2, /* offset **/0);
glDrawArrays(GL_QUADS, 0, etn.getVboData().capacity());
我无法获得正确的偏移量和步幅,所以当我渲染时我看到了这个奇怪的人工制品..
最佳答案
步幅是两个元组之间的距离,偏移量是从 0 到第一个元组的第一次出现之间的距离
例如,对于每个位置有 3 个 float 的三角形,然后正常有 3 个 float 的三角形,它看起来像这样
glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3));
glEnableVertexAttribArray(1);
所以你的顶点指针的偏移量为 0(假设前三个条目是位置)和步幅为 24(假设你的顶点颜色直接在顶点位置之后)
对于颜色指针,偏移量将是 (GLvoid*) (sizeof(float)*3)
作为第一个颜色三元组之前的三个 GLfloats
这一切都假设你的交错数组是这样构建的
VVVCCCVVVCCCVVVCCC 等等
对于使用仅具有顶点和法线信息以及面的模型的 C++ 中非常简单的示例,您可以查看以下代码:http://www.incentivelabs.de/Sourcecode/OpenGL10.zip
关于java - OpenGL Interleaved VBO 跨步和偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000110/