Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Opengl 片段着色器GLSL中未使用的变量-它们会影响性能吗_Opengl_Opengl Es_Glsl_Opengl Es 2.0_Gpu - Fatal编程技术网

Opengl 片段着色器GLSL中未使用的变量-它们会影响性能吗

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中使用,问题或编译器会对其进行优化 例

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编译器上-这些类型的优化将是内置的?千万不要假设“将”用于优化-你将应用程序的性能置于你无法控制的东西手中。特别是在移动设备上,在所有优化和编译时间之间进行权衡,这通常是困难的。“将优化”的唯一保证来自应用程序。。。。按照我最初的回答;未使用的东西(顶点属性)的最大成本无法轻易优化。即使编译器优化了着色器之间的差异,它仍然存在于输入流中,浪费带宽。