我想做这样的事情:
vec4 text;
if (something){
text = texture(backgroundTexture, pass_textureCoords);
}
if (somethingElse){
text = texture(anotherTexture, pass_textureCoords);
}
这是有效的GLSL代码,如果没有,是否有合适的替代方案?
答案 0 :(得分:3)
答案取决于something
和somethingElse
实际上是什么。
如果这是一个统一的控制流,这意味着所有着色器调用都执行相同的分支,那么这是完全有效的。
如果它们是非均匀表达式,则存在一些限制:
当纹理使用任何类型的mipmapping或各向异性过滤时,任何需要隐式导数的纹理函数都将检索未定义的结果。
总结一下:是的,这是非常有效的glsl代码,但非均匀控件流中的纹理有一些限制。有关详细信息,请访问here。
附注:在代码示例中,您之后不会声明变量。您只是为它们分配值。
修改(更多信息)
详细说明均匀和非均匀控制流是什么:着色器可以(通常)有两种类型的输入。像uniform vec3 myuniform;
这样的统一变量和in vec3 myvarying
之类的变量。不同之处在于数据来自何处以及在调用期间如何更改数据:
统一控制流现在意味着相应的if语句仅的条件取决于制服。其他一切都是非均匀的控制流程。我们来看看这个片段着色器示例:
//Uniforms
uniform vec3 my_uniform;
uniform sampler2D my_sampler;
/Varyings
in vec2 tex_coord;
in vec2 ndc_coords;
void main()
{
vec3 result = vec3(0,0,0);
if (my_uniform.y > 0.5) //Uniform control flow
result += texture(my_sampler, tex_coord).rgb;
if (ndc_coords.y > 0.5) //Non-uniform control flow
result += texture(my_sampler, tex_coord).rgb;
float some_value = ndc_coords.y + my_uniform.y;
if (some_value > 0.5) //Still non-uniform control flow
result += texture(my_sampler, tex_coord).rgb;
}
在此着色器中,只有第一个纹理读取发生在统一控制流中(因为if条件仅取决于统一变量)。其他两个读取处于非均匀控制流程中,因为if条件还取决于变化(ndc_coords
)。