GLSL:考虑未使用的变量

GLSL : Considering not used variables

我想知道是否应该考虑 glsl 中未使用的变量。

在下一种情况下(这只是描述的示例代码)。 如果 "trigger" 为真,则片段着色器中不使用 "position" 和 "normal"。 那么,"position"和"normal"是被抛弃了吗?还是通过光栅器计算?

顶点着色器:

layout(location = 0) in vec3 vertice;
layout(location = 1) in vec2 uv;
layout(location = 2) in vec3 normal;

out VertexData{
    out vec3 position;
    out vec2 uv;
    out vec3 normal;
    flat out bool trigger;
} VertexOut;

void main(){
    gl_Position = vertice;
    VertexOut.uv = uv;
    if(uv.x > 0){
        VertexOut.trigger = true;
    else{
        VertexOut.trigger = false;
        VertexOut.position = vertice;
        VertexOut.normal = normal;
    }
}

片段 shdaer :

in VertexData{
    in vec3 position;
    in vec2 uv;
    in vec3 normal;
    flat in bool trigger;   
}VertexIn;

out vec4 color;

uniform sampler2D tex;

void main(){
    if(VertexIn.trigger){
        color = texture2D(tex, VertexIn.uv);
    }
    else{
        vec4 result = texture2D(tex, VertexIn.uv);
        /*
            Lighting with position and normal...
        */

        color = result;
    }
}

取决于硬件。在较新的硬件上,智能编译器可以避免 interpolating/fetching 这个值。较旧的硬件没有片段着色器可控制的此操作,因此无论如何都会完成(从未定义的值插值 - 仍然未定义)。

虽然条件操作不是免费的,尤其是当您的片段分支高度不同时。