OpenGL指示缓冲区是否值得使用?

OpenGL指示缓冲区是否值得使用?,opengl,shader,Opengl,Shader,我目前正在学习OpenGL的3D渲染,对于着色器和VBO的一些事情我还不太了解,我知道所有VBO共享一个索引,因此需要复制一些数据 但是,当你创建更多的VBO时,几乎没有顶点共享相同位置法线和纹理坐标的面,所以索引至少在我看来是无用的,它基本上只是一个连续数字的数组 有没有我看不到的指示缓冲区?在闭合网格中,每个顶点至少由两个面共享。(顶点使用次数少于三次的唯一情况是在双面网格中,其中两个面具有相同的顶点,但法线和缠绕顺序相反。)不使用索引和仅复制顶点不仅效率低下,而且至少会使所需的顶点数据量翻

我目前正在学习OpenGL的3D渲染,对于着色器和VBO的一些事情我还不太了解,我知道所有VBO共享一个索引,因此需要复制一些数据

但是,当你创建更多的VBO时,几乎没有顶点共享相同位置法线和纹理坐标的面,所以索引至少在我看来是无用的,它基本上只是一个连续数字的数组


有没有我看不到的指示缓冲区?

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

此外,还有可能发生缓存抖动,这是可以避免的,相关的管道暂停和其他疯狂行为

我是你的朋友。了解他们

更新

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


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

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

在高性能图形中使用的大多数网格,特别是那些具有显著多边形密度的网格,都是平滑的。这些网格上的法线基本上是平滑的,因为建模器通常近似于一个主要曲面。哦,是的,这里和那里可能有一些尖锐的边缘,但在大多数情况下,这种模型中的每个位置都有一个法线

纹理坐标通常也会在网格之间平滑变化。有一定的纹理坐标边缘;经过良好优化的UV展开通常会产生这类结果。但是如果你有一个真实大小的网格(10K+顶点),大多数位置都有一个纹理坐标。切线/双切线基于纹理坐标的变化,因此它们将匹配纹理拓扑

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


但这并没有改变这样一个事实,即一般来说,这些案件是例外,而不是规则。即使您的代码总是涉及这些情况,但对于大多数高性能图形应用程序来说,情况并非如此。

什么,您正在渲染一组立方体吗?你有没有考虑过非立方体网格或平滑网格是如何工作的?@Nicolas我正在渲染低多边形模型,我的观点是,非平面的高多边形模型显然比渲染的模型有更多的顶点共享。仅仅因为一个工具对你的用例无效,并不意味着你应该认为它是错误的。如果你有正常的+顶点+切线,你几乎没有重复。vertices@EvgenyKaravashkin:穿过什么样的网格?大多数网格不是面状的,因此法线将是平滑的。大多数网格使用平滑纹理坐标,因此切线/双切线将是平滑的。那么你在说什么样的网格呢。