Opengl 片段着色器GLSL中未使用的变量-它们会影响性能吗
GLSL中未使用的变量会发生什么变化 GPU有内部着色器缓冲区,该缓冲区将填充这些值,但由于片段着色器未使用该缓冲区,因此在顶点着色器(逐顶点)中执行的计算将不会不必要,然后会被删除,因为它未在片段着色器中使用Opengl 片段着色器GLSL中未使用的变量-它们会影响性能吗,opengl,opengl-es,glsl,opengl-es-2.0,gpu,Opengl,Opengl Es,Glsl,Opengl Es 2.0,Gpu,GLSL中未使用的变量会发生什么变化 GPU有内部着色器缓冲区,该缓冲区将填充这些值,但由于片段着色器未使用该缓冲区,因此在顶点着色器(逐顶点)中执行的计算将不会不必要,然后会被删除,因为它未在片段着色器中使用 GLSL编译器可以优化这些错误的实践吗 如果不是,如果这些变化可以从下面的示例中完全从顶点着色器中删除,性能会有任何改进吗 注意:我还没有写过这个着色器-我在分析和调试GL应用程序时遇到过这个着色器,所以我很想知道这些是否会导致性能下降。如果不在FS中使用,问题或编译器会对其进行优化 例
attribute vec3 Normal;
attribute vec4 Vertex;
uniform mat3 NormalMatrix;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelViewMatrix;
precision mediump float;
**varying vec3 N;**
**varying vec3 v;**
varying vec2 texCor;
void main(void)
{
v = vec3(ModelViewMatrix * Vertex);
N = normalize(NormalMatrix * Normal);
gl_Position = ModelViewProjectionMatrix * Vertex;
texCor = MultiTexCoord0.xy;
}
片段着色器
precision mediump float;
uniform sampler2D data;
**varying vec3 N;**
**varying vec3 v;**
varying vec2 texCor;
void main (void)
{
vec2 TexCoord = texCor;
vec4 RGB = texture2D( data, TexCoord );
gl_FragColor = vec4(0.0, 0.0, 0.0 , RGB.r);
}
GLSL编译器可以优化这些错误的实践吗
原则上是的,尽管不能保证它们按照需要的状态执行操作,该状态仅在链接时可用,而在着色器编译时不可用。在Vulkan中,当管道中的所有着色器都同时编译时,这将更加容易
如果没有,如果这些变化可以从顶点着色器中完全删除,性能会有任何改进吗
很可能是的,但是YMMV。不要告诉GPU去做一些你实际上不需要它去做的事情,这只是常识
这里最重要的优化实际上是数据端。大多数应用程序都会交错所有属性的顶点数据,因此,如果交错缓冲区中有未使用的数据元素,那么这些数据元素将被拉入GPU,浪费带宽、缓存空间、消耗电源,等等。图形驱动程序不太可能消除这种低效,因为应用程序可以随时调用glMapBuffer
总之,优化着色器和数据结构以删除不需要的内容。同时以正确的精度上载内容(如果着色器只需要fp16等,则不要上载fp32数据)。此处使用的是古老的语法,早于GL分离着色器阶段的能力 要启动并运行此GLSL程序,唯一的方法是将其完全链接。在这一点上,优化GLSL编译器(全部?)将消除未链接的输入/输出(这在最后阶段对输出没有贡献)
考虑到主动一致性确定是编译/链接过程中的一个强制性部分,所有GLSL实现都应该知道如何进行静态分析。规范已经保证了死代码消除的基本水平。即使是最简单的实现。感谢您的解释,我不太明白“在应用程序的CPU上统一计算”是什么意思。我想把这项工作转移到gpu(核心)上会比在cpu上做这个更快,或者我这里遗漏了一些东西。事实上,我可能欠你一个道歉;我快速阅读,并将其作为MVP的单独乘法阅读。很明显,您已经在连接CPU上的MVP了-对不起!(一边吃三明治一边快速回答的缺点)作为一个具体的例子,NVIDIA的GLSL编译器以两次通过的过程而闻名。初始编译速度非常快,因为它或多或少需要进行语法验证。代码生成是在链接时间进行的,在所有其他阶段都被裁剪之后。你是说在最新一代的GLSL编译器上-这些类型的优化将是内置的?千万不要假设“将”用于优化-你将应用程序的性能置于你无法控制的东西手中。特别是在移动设备上,在所有优化和编译时间之间进行权衡,这通常是困难的。“将优化”的唯一保证来自应用程序。。。。按照我最初的回答;未使用的东西(顶点属性)的最大成本无法轻易优化。即使编译器优化了着色器之间的差异,它仍然存在于输入流中,浪费带宽。