[英]Fragment shader behavior on iOS
我正在對iOS應用程序的片段着色器進行一些基本的優化。 我想將幾種顏色之一分配給gl_FragColor
。 我的第一次嘗試是使用三元運算符。 這可以在模擬器和iPhone 5C上正確顯示內容:
lowp float maxC = max(color.r, max(color.g, color.b);
lowp float minC = min(color.r, min(color.g, color.b);
gl_FragColor.rgb = (maxC > 1.0 ? result0 : (minC < 0.0 ? result1 : result2));
我嘗試用mix
和step
的組合替換三元運算符,以查看是否可以用更少的分支來復制上述邏輯。 不幸的是,這在模擬器中有效,但在iOS設備上無效:
lowp float step0 = step(0.0, minC);
lowp float step1 = step(1.001, maxC);
lowp vec3 mix0 = mix(result1, result2, step0);
gl_FragColor.rgb = mix(mix0, result0, step1);
具體來說,在模擬器中正確繪制的屏幕的某些白色區域被錯誤地繪制為設備上的黑色區域。 其他一切看起來都很好。
以上step
和mix
無法產生與使用三元運算符的方法相同的結果的原因有哪些?
OpenGL着色器中浮點運算的確切細節可能很難理解。 可能發生的情況是,GLSL編譯器正在將三元運算符優化為乘以零運算。 請查看避免着色器條件,以獲取有關如何將條件條件折疊為乘法或其他簡單操作的信息。 最有用的實用程序功能是:
float when_eq(float x, float y) {
return 1.0 - abs(sign(x - y));
}
使用的一個例子是:
float comp = 0.0;
comp += when_eq(vTest, 0.0) * v1;
comp += when_eq(vTest, 1.0) * v2;
上面的代碼將根據vTest的當前值將comp設置為v1或v2。 一定要測試此顯式實現與編譯器生成的三元隱式測試,以查看哪種更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.