Ich habe einen sehr einfachen Shader und habe linearen Nebel über einen Mix wie diesen hinzugefügt:
finalColor = mix(finalColor, vec3(0.5, 0.8, 0.95), vUVoutAndViewZ.z);
Beachten Sie, dass sich der Abstand der Ansicht Z in der Variablen befindet, die auch die UV-Koordinaten enthält, sodass der Nebel nicht einmal einen neuen Interpolator hinzugefügt hat.
Trotzdem brachte diese eine harmlose Linie die Framerate des OG Droid mit dem Power SGX-Chipsatz von 33 fps auf 22 fps. Auch das HTC Evo mit der Adreno 200 GPU bleibt unter 30fps. (Der Adreno 205 hat eine konstante Geschwindigkeit von 60 fps, aber das Ding ist ein Biest).
Der Fragment-Shader selbst ist primitiv (alle Werte sind fest codiert, da es sich um einen Test-Shader handelt):
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);
}
Ich habe die Lowp / Mediump-Deklarationen später hinzugefügt (was ungefähr 2fps hinzugefügt hat), es funktioniert genauso schlecht ohne sie.
Ich weigere mich zu glauben, dass der PowerVR-Chipsatz so schwach ist, dass er mit einem einfachen Shader wie diesem nicht umgehen kann. In diesem Shader muss etwas Dummes sein (wie etwas, das implizit ein Lowp-Register durcheinander bringt), das das Gerät nur völlig durcheinander bringt.
ANTWORT und BEARBEITEN:
Ellis hat einige fantastische Informationen in der Antwort und den nachfolgenden Kommentaren. In diesem speziellen Fall scheint mix () völlig kaputt zu sein. Es brachte den Shader auf 12 Zyklen (von 4) und 4 GPRs (von 2). Ich bin mit diesem Code auf 29 fps zurückgekehrt:
lowp vec3 fogDiff = vec3(0.5, 0.8, 0.95) - finalColor;
fogDiff *= vUVoutAndViewZ.z;
finalColor += fogDiff;
mix()
die Framerate getötet wurde, war ich nicht zu geneigt, eine zu werfen pow
, um sie zu beenden.