iOSアプリケーションのフラグメントシェーダで基本的な最適化を行っています。私はgl_FragColor
にいくつかの色の1つを割り当てたいと思います。私の最初の試みは三元演算子を使用しました。これは、シミュレータやiPhone 5Cの両方に正しく物事を表示します。iOSでのフラグメントシェーダの動作
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
の組み合わせが、3値演算子を使用するアプローチと同じ結果を再現しない理由は何ですか?