私は非常にシンプルなシェーダーを使用しており、次のようなミックスを介して線形フォグを追加しました。
finalColor = mix(finalColor, vec3(0.5, 0.8, 0.95), vUVoutAndViewZ.z);
ビューのZ距離は、UV座標も含む変数内にあるため、フォグは新しい補間を追加していません。
それでも、この1本の無害なラインは、33 Spsから22 FpsのPower SGXチップセットを搭載したOG Droidのフレームレートをもたらしました。Adreno 200 GPUを備えたHTC Evoでも30fps未満にとどまります。(Adreno 205は一定の60fpsですが、それは獣です)。
フラグメントシェーダー自体はプリミティブです(テストシェーダーであるため、すべての値はハードコードされています)。
precision mediump float;
varying mediump vec3 vUVoutAndViewZ;
varying lowp vec3 vNormalOut;
uniform lowp sampler2D diffuse;
void main() {
lowp vec3 normal = vNormalOut;
// Lighting
lowp vec3 lightDir = vec3(0.5, 0.3, 0.5);
lowp vec3 light = vec3(dot(normal, lightDir));
lowp vec3 diffuse = texture2D(diffuse, vUVoutAndViewZ.xy).rgb;
lowp vec3 finalColor = diffuse * light;
// Fog
finalColor = mix(finalColor, vec3(0.5, 0.8, 0.95), vUVoutAndViewZ.z);
gl_FragColor = vec4(finalColor.xyz, 1.0);
}
後でlowp / mediump宣言を追加しました(約2fpsを追加しました)。それなしでも同じように機能します。
PowerVRチップセットは非常に弱いため、このような単純なシェーダーを処理できないとは思いません。このシェーダーには、ユニットを完全に台無しにするだけの愚かなもの(暗黙的にlowpレジスターをスウィズルするようなもの)が必要です。
回答と編集:
エリスは答えとそれに続くコメントにいくつかの素晴らしい情報を持っています。この特定のケースでは、mix()は完全に壊れているようです。シェーダーを12サイクル(4から)および4 GPR(2から)にしました。代わりにこのコードを使用して29fpsに戻しました。
lowp vec3 fogDiff = vec3(0.5, 0.8, 0.95) - finalColor;
fogDiff *= vUVoutAndViewZ.z;
finalColor += fogDiff;
mix()
フレームレートを殺す方法についてのものなpow
ので、それを終了するために投げ込む傾向があまりありませんでした。