我願做這樣的事情:我可以啓動空白變量並在之後聲明它們嗎?
vec4 text;
if (something){
text = texture(backgroundTexture, pass_textureCoords);
}
if (somethingElse){
text = texture(anotherTexture, pass_textureCoords);
}
這是有效的GLSL代碼,如果沒有,有沒有合適的替代品?
我願做這樣的事情:我可以啓動空白變量並在之後聲明它們嗎?
vec4 text;
if (something){
text = texture(backgroundTexture, pass_textureCoords);
}
if (somethingElse){
text = texture(anotherTexture, pass_textureCoords);
}
這是有效的GLSL代碼,如果沒有,有沒有合適的替代品?
答案取決於something
和somethingElse
究竟是什麼。
如果這是一個統一的控制流,這意味着所有着色器調用執行相同的分支,那麼這是完全有效的。
如果它們不均勻表達式,則存在一些侷限性:
當一個紋理使用紋理映射或任何種類的各向異性過濾,然後,需要隱衍生物將檢索未定義的結果的任何紋理函數。
概括起來:是的,這是完全合法的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條件也取決於變化的(ndc_coords
)。
將「something」改成「something.y <50」。那麼它會起作用嗎? – Joehot200
當某件東西是制服時:是的,如果東西是變化的:有上述限制(沒有隱含的衍生物)。 – BDL
我對你制服或變化的含義有點困惑。我們只是說這是我通過着色器中的其他代碼以某種方式獲得的一個整數。 – Joehot200