GLSL中未使用的变量变量会发生什么 GPU具有帧间着色器缓冲区,这些缓冲区将填充这些值,但由于片段着色器未使用它,因此不能进行在顶点着色器(每个顶点)和顶点着色器中进行的unnesscary计算。然后丢弃,因为它没有在片段着色器中使用。
注意:我还没有写过这个着色器 - 我在剖析时发现了这个着色器&调试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);
}
答案 0 :(得分:3)
GLSL编译器能否优化这些错误做法?
原则上是的,虽然不能保证他们这样做,因为它需要只有链接时的状态,而不是着色器编译时。在管道中的所有着色器同时编译时,Vulkan会更容易。
如果不是,如果可以从顶点着色器中完全删除这些变化,是否会有任何性能提升
很可能是的,但是YMMV。不要告诉GPU做一些你实际上不需要做的事情,这只是常识...
这里关键的主要优化实际上是数据方面。大多数应用程序将交错所有属性的顶点数据,因此如果交错缓冲区中有未使用的数据元素,那么它将被拉入GPU,浪费带宽,缓存空间,燃烧功率等。图形驱动程序极不可能消除这种低效率,因为应用程序可以随时调用glMapBuffer
。
总结 - 优化着色器和数据结构,以删除您不需要的内容。还要以正确的精度上传内容(如果着色器只需要fp16等,请不要上传fp32数据)。
答案 1 :(得分:0)
这里使用的是古老的语法,它早于GL分离着色器阶段的能力。
启动和运行此GLSL程序的唯一方法是完全链接。在这一点上,优化的GLSL编译器(所有这些?)将消除未链接的输入/输出(这是在最后阶段不会产生输出的东西)。
这是所有静态分析的东西,任何GLSL实现都应该知道如何考虑主动统一确定是编译/链接过程的必要部分。规范已经保证了基本消除代码的基本程度。即使是最简单的实现也是如此。