Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果没有照明计算,是否应该忽略顶点法线?_C++_Opengl_Optimization - Fatal编程技术网

C++ 如果没有照明计算,是否应该忽略顶点法线?

C++ 如果没有照明计算,是否应该忽略顶点法线?,c++,opengl,optimization,C++,Opengl,Optimization,我有一个openGL程序,不使用任何类型的照明或着色;阴影的幻觉完全通过纹理完成,因为网格是低多边形。面不是反裁剪的,当然我也不会使用法线贴图 我的问题是,我应该定义顶点法线吗?排除它们会使用更少的资源并加快渲染速度,还是会在某种程度上对性能/视觉效果产生负面影响 我的问题是,我应该定义顶点法线吗 如果不使用,则没有必要这样做 排除它们会使用更少的资源并加快渲染速度,还是会在某种程度上对性能/视觉效果产生负面影响 如果没有使用,它肯定不会影响视觉效果 您没有提到是否使用旧的固定功能管道或现代可编

我有一个openGL程序,不使用任何类型的照明或着色;阴影的幻觉完全通过纹理完成,因为网格是低多边形。面不是反裁剪的,当然我也不会使用法线贴图

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

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

如果不使用,则没有必要这样做

排除它们会使用更少的资源并加快渲染速度,还是会在某种程度上对性能/视觉效果产生负面影响

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

您没有提到是否使用旧的固定功能管道或现代可编程管道。在旧的固定功能管道中,法线仅用于照明计算。这与人脸剔除无关。正面/背面仅由屏幕空间中的基本缠绕顺序决定

如果使用可编程管道,则法线将用于所使用的任何对象。德国劳埃德船级社本身根本不关心这一点

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


仅当您使用立即模式(
glBegin()
/
glEnd()
)指定几何体(您真的不应该这样做),排除法线将为每个顶点节省一个gl函数调用,这将带来显著的改进(但仍将比使用顶点数组慢几个数量级).

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

性能的影响更多地是关于如何更改顶点布局以及由此对变换前缓存产生的影响(假设您具有交错顶点格式)。与CPU、GPU在缓存线中获取数据一样,如果没有(或有)法线,则可以更好地与缓存线对齐,这可能会影响性能。例如,如果您的顶点大小为32字节,删除法线会使其减少到20字节,这将导致GPU为某些顶点获取2条缓存线,而对于32字节顶点格式,它总是只获取一条缓存线。但是,如果顶点大小为44字节,删除法线会将其减少到32字节,那么这肯定是一个改进(更好的对齐和更少的数据)

但是,这最终是一个非常精细的优化,不太可能产生任何重大影响,除非您使用非常轻量级的顶点/像素着色器(例如阴影过程)通过管道推动大量几何体