没有光照计算时,我应该省略顶点法线吗?

时间:2014-06-22 15:31:52

标签: c++ opengl optimization

我有一个不使用任何类型的灯光或阴影的openGL程序;阴影的幻觉完全通过纹理完成,因为网格是低聚的。面部不是背面,我当然不会使用法线贴图。

我的问题是,我应该定义顶点法线吗?排除它们会使用更少的资源和速度渲染,还是会以某种方式排除它们对性能/视觉效果产生负面影响?

2 个答案:

答案 0 :(得分:1)

  

我的问题是,我应该定义顶点法线吗?

如果不使用它们,则没有必要。

  

排除他们会使用更少的资源和速度渲染,还是会以某种方式排除他们对性能/视觉效果产生负面影响?

如果没有使用,它肯定不会影响视觉效果。

您没有提及是否使用旧的固定功能管道或现代可编程管道。在旧的固定功能管道中,法线仅 用于照明计算。面部剔除没有没有。前/后侧仅由屏幕空间中的原始卷绕顺序决定。

如果您使用可编程管道,则法线用于您使用它们的任何内容。 GL本身并不关心它。

因此排除它们会导致存储对象所需的内存减少。如果渲染实际上变得更快则难以预测。如果不使用法线,则无论是否提供,都不应取法线。但是缓存在这里也会产生影响,所以不提取它们的改进可能根本不会引起注意。

只有当你使用立即模式(glBegin() / glEnd())指定几何(你真的不应该这样做)时,排除法线将为每个顶点保存一个gl函数调用,并且这应该会有显着的改进(但仍然会比使用顶点数组慢几个数量级)。

答案 1 :(得分:1)

如果法线不用于照明,则不需要它们(它们也不用于背面剔除)。

性能的影响更多地是关于它如何改变顶点布局以及对预变换缓存的影响(假设您有交错的顶点格式)。就像在CPU上,GPU在高速缓存行中获取数据一样,如果没有(或有)法线,你可以更好地与高速缓存行对齐,它可以对性能产生影响。例如,如果您的顶点大小是32个字节并且正常的移除将其降低到20个字节,这将导致GPU为一些顶点提取2个高速缓存行,而对于32个字节的顶点格式,它总是仅提取一个高速缓存行。但是,如果您的顶点大小为44个字节并且正常删除将其缩小到32个字节,那么肯定它是一个改进(更好的对齐和更少的数据)。

然而,这最终是一个非常精细的级别优化,并且不太可能产生任何重大影响,除非你真的通过非常轻量级的顶点/像素着色器(例如阴影传递)通过管道推动大量几何。