在glDrawElements(OpenGL/VBOs)中为顶点和法线使用不同的数组

Tux*_*xer 7 opengl vbo

我目前正在OpenGL中编写.obj加载程序.我将顶点数据存储在VBO中,然后使用Vertex Attribs绑定它.法线也是如此.事实上,普通数据和顶点数据不会以相同的顺序存储.

我想,我给glDrawElements渲染网格的索引是用OpenGL来获取顶点VBO中的顶点并在法线VBO中得到法线.

除了使用glBegin/glVertex/glNormal/glEnd告诉glDrawElements使用顶点索引和法线的其他索引之外,还有一种opengl方式吗?谢谢

Dam*_*mon 7

虽然您可以通过在着色器内索引到缓冲区纹理(OpenGL 3.1功能)模拟它,但没有直接的方法可以做到这一点.

但通常不建议做这样的事情.OBJ格式允许一次通过几个(原则上任意数量)顶点引用一个法线,因此通常要做的是构建一个"完整"顶点,包括每个顶点的坐标和法线和texcoords(复制相应的数据) ).

这样可以确保
a)平滑的阴影表面正确渲染
b)正确渲染硬边

(两者之间的差异只是几个顶点共享相同,相同的法线)

  • 请注意,当我说"不可取"时,我的意思是.逻辑不仅比构造适当的顶点流并上传它复杂得多,而且它也意味着随机而不是顺序数据访问,即您在每个顶点上都有或多或少的保证缓存未命中. (2认同)

Sur*_*ine 2

您必须对位置/法线/纹理坐标等使用相同的索引。这意味着在加载 .obj 时,您必须插入唯一的顶点并将面指向它们。