OpenGL indexsBuffer是否值得使用?

时间:2018-06-26 14:03:08

标签: opengl shader

我目前正在学习用于3D渲染的OpenGL,但我不太了解有关着色器和VBO的某些知识,我发现所有VBO共享一个索引,因此您需要复制一些数据

但是当您创建更多的VBO时,几乎没有面的顶点共享相同的位置法线和纹理坐标,因此至少从我的角度来看,这些索引至少是无用的,基本上只是连续数字的数组。 / p>

有没有我没有看到的indexsBuffers方面?

2 个答案:

答案 0 :(得分:5)

与所有顶点规范功能的使用一样,索引缓冲区的使用取决于您的网格数据。

在高性能图形中使用的大多数网格,尤其是那些具有显着多边形密度的网格,都是平滑的。跨此类网格的法线主要是平滑的,因为建模者通常逼近一个主要是曲面的表面。哦,是的,到处都有一些锐利的边缘,但是在大多数情况下,此类模型中的每个位置都有一个法线。

纹理坐标通常在网格之间也平滑变化。当然有纹理坐标的边缘。最佳化的紫外线解开通常会产生这类问题。但是,如果您具有真实大小的网格(10K +顶点),则大多数位置具有单个纹理坐标。并且切线/切线基于纹理坐标的变化,因此它们将与纹理拓扑匹配。

是否存在普通拓扑与位置拓扑高度不相交的网格?是。多维数据集就是一个明显的例子。但是,通常需要高度多面的几何图形,以实现特定外观或使用低多边形。在这些情况下,正常的索引渲染可能对您没有好处。

但是,这并不能改变以下事实:通常来说,这些情况是例外,而不是规则。即使您的代码总是涉及到这些情况,但对于大多数高性能图形应用程序而言,事实并非如此。

答案 1 :(得分:2)

在封闭的网格中,每个顶点至少由两个面共享。 (一次使用顶点的次数少于三倍是在双面网格中,其中两个面具有相同的顶点,但法线和缠绕顺序相反。)不使用索引,而只是复制顶点,不仅效率低下,但至少要使所需的顶点数据量增加一倍。

还有缓存颠簸的可能性,否则可以避免这种情况,相关的管道停顿和其他精神错乱。

索引是您的朋友。了解他们。

更新

通常,法线等存储在法线贴图中或在顶点之间进行插值。

如果只需要多面或“平面阴影”渲染,请使用dFdx()dFdy()的叉积(或在HLSL中使用ddx()ddy())在片段着色器中生成每个像素的法线。复制数据是不好的,只有在非常特殊和异常的情况下才需要复制。您没有提到任何让我相信这对于您的用例是必需的。