【发布时间】:2014-08-12 17:13:42
【问题描述】:
我有一个不使用任何光照或阴影的 openGL 程序;阴影的错觉完全是通过纹理完成的,因为网格是低多边形的。面不会被剔除,当然我也不会使用法线贴图。
我的问题是,我是否应该定义顶点法线?排除它们会使用更少的资源并加快渲染速度,还是会以某种方式对性能/视觉效果产生负面影响?
【问题讨论】:
标签: c++ opengl optimization
我有一个不使用任何光照或阴影的 openGL 程序;阴影的错觉完全是通过纹理完成的,因为网格是低多边形的。面不会被剔除,当然我也不会使用法线贴图。
我的问题是,我是否应该定义顶点法线?排除它们会使用更少的资源并加快渲染速度,还是会以某种方式对性能/视觉效果产生负面影响?
【问题讨论】:
标签: c++ opengl optimization
我的问题是,我是否应该定义顶点法线?
如果不使用,则不需要。
排除它们会使用更少的资源并加快渲染速度,还是会以某种方式对性能/视觉效果产生负面影响?
如果不使用它绝对不会影响视觉效果。
您没有提及您是使用旧的固定功能管道还是现代可编程管道。在旧的固定功能管线中,法线仅用于光照计算。 与面部剔除无关。正面/背面仅由屏幕空间中的原始缠绕顺序决定。
如果您使用可编程流水线,法线将用于您使用的任何内容。 GL本身根本不会在意。
因此,排除它们应该会减少存储对象所需的内存。如果渲染实际上变得更快是很难预测的。如果不使用法线,则甚至不应该获取它们,无论是否提供它们。但是缓存也会在这里产生影响,因此不获取它们的改进可能根本不明显。
仅当您使用即时模式(glBegin()/glEnd())来指定几何体(您真的不应该这样做)时,排除法线将为您节省每个顶点的一次 gl 函数调用,这应该给出一个显着的改进(但仍将比使用顶点数组慢几个数量级)。
【讨论】:
如果法线不用于照明,则不需要它们(它们也不用于背面剔除)。
性能的影响更多的是关于这如何改变您的顶点布局以及对预转换缓存的影响(假设您有交错的顶点格式)。就像在 CPU 上一样,GPU 在缓存行中获取数据,如果没有(或有)法线,您可以更好地与缓存行对齐,它会对性能产生影响。例如,如果您的顶点大小为 32 字节,而删除法线使其降至 20 字节,这将导致 GPU 为某些顶点获取 2 个缓存行,而对于 32 字节顶点格式,它始终只获取一个缓存行。但是,如果您的顶点大小为 44 字节并且删除法线会将其减少到 32 字节,那么可以肯定它是一种改进(更好的对齐和更少的数据)。
但是,这最终是一个非常精细的优化级别,无论哪种方式都不太可能产生任何重大影响,除非您真的使用非常轻量级的顶点/像素着色器(例如阴影通道)通过管道推动大量几何体。
【讨论】: