我想知道我是否应该考虑在glsl中不使用变量。
在下一种情况下(这只是描述的示例代码)。 如果"触发"是的,"位置" "正常"不在片段着色器中使用。 那么,"位置" "正常"弃?或由rasterizer计算?
顶点着色器:
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;
}
}
Fragment 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;
}
}
答案 0 :(得分:1)
取决于硬件。在较新的硬件上,智能编译器可以避免内插/获取此值。较旧的硬件不能通过片段着色器控制此操作,因此无论如何都会完成(从未定义的值插入 - 仍未定义)。
条件操作不是免费的,特别是如果您的片段分支高度分歧。