碎片着色器GLSL中未使用的变化变量 - 它们是否会伤害Perf

时间:2016-10-26 15:58:59

标签: opengl opengl-es glsl opengl-es-2.0 gpu

GLSL中未使用的变量变量会发生什么 GPU具有帧间着色器缓冲区,这些缓冲区将填充这些值,但由于片段着色器未使用它,因此不能进行在顶点着色器(每个顶点)和顶点着色器中进行的unnesscary计算。然后丢弃,因为它没有在片段着色器中使用。

  1. GLSL编译器能否优化这些错误做法?
  2. 如果不是,如果从下面的exapmle中完全从顶点着色器中删除这些变化,是否会有任何性能提升?
  3. 注意:我还没有写过这个着色器 - 我在剖析时发现了这个着色器&调试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);
    }
    

2 个答案:

答案 0 :(得分:3)

  

GLSL编译器能否优化这些错误做法?

原则上是的,虽然不能保证他们这样做,因为它需要只有链接时的状态,而不是着色器编译时。在管道中的所有着色器同时编译时,Vulkan会更容易。

  

如果不是,如果可以从顶点着色器中完全删除这些变化,是否会有任何性能提升

很可能是的,但是YMMV。不要告诉GPU做一些你实际上不需要做的事情,这只是常识...

这里关键的主要优化实际上是数据方面。大多数应用程序将交错所有属性的顶点数据,因此如果交错缓冲区中有未使用的数据元素,那么它将被拉入GPU,浪费带宽,缓存空间,燃烧功率等。图形驱动程序极不可能消除这种低效率,因为应用程序可以随时调用glMapBuffer

总结 - 优化着色器和数据结构,以删除您不需要的内容。还要以正确的精度上传内容(如果着色器只需要fp16等,请不要上传fp32数据)。

答案 1 :(得分:0)

这里使用的是古老的语法,它早于GL分离着色器阶段的能力。

启动和运行此GLSL程序的唯一方法是完全链接。在这一点上,优化的GLSL编译器(所有这些?)将消除未链接的输入/输出(这是在最后阶段不会产生输出的东西)。

这是所有静态分析的东西,任何GLSL实现都应该知道如何考虑主动统一确定是编译/链接过程的必要部分。规范已经保证了基本消除代码的基本程度。即使是最简单的实现也是如此。