opengl - 片段着色器 GLSL 中未使用的可变变量 - 它们会伤害性能吗

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

GLSL 中未使用的可变变量发生了什么 GPU 具有内部着色器缓冲区,这些缓冲区将填充这些值,但由于片段着色器未使用它,这不会是在顶点着色器(每个顶点)中完成的不必要的计算,然后由于它未在片段着色器中使用而被丢弃。

  1. GLSL 编译器可以优化这些错误做法吗?
  2. 如果不是,如果可以从下面的示例中完全从顶点着色器中移除这些变化,是否会有任何性能改进?

注意:我还没有编写这个着色器 - 我在分析和调试 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);
}

最佳答案

Can GLSL compilers optimize these kind of wrong practices ?

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

If NOT , Would there be any performance improvement if these varying can completely be removed from vertex shader

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

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

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

关于opengl - 片段着色器 GLSL 中未使用的可变变量 - 它们会伤害性能吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266988/

相关文章:

c++ - glCreateShader 导致 EXC_BAD_ACCESS

opengl - GLSL 中是否有用于 AND 的内置函数,或者是否有一些优化的方法来执行组件明智的 AND?

iPad GLSL。从片段着色器中如何获得表面(而不是顶点)法线

java - 适用于 Android 的 OpenGL ES 需要 2.0 命令才能用于 3.0 上下文吗?

c++ - 如何使用glslang

opengl - 使用几何着色器分层渲染到 CUBEMAP

Opengl 简单片段着色器在纹理上叠加半透明三角形带

math - OpenGL 数学 - 将屏幕空间投影到世界空间坐标

android - 在 GLSurfaceView 上绘制 2D

opengl - GLSL Gif 抖动效果 : Optimization