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;
quelle
mix()
die Framerate getötet wurde, war ich nicht zu geneigt, eine zu werfenpow
, um sie zu beenden.Antworten:
Antwort von EboMike, berechnet mit PVRUniSCo Editor: mix () bringt den Shader von 4 auf 12 Zyklen (PowerVR).
Der PowerVR 530/535 ist sehr langsam. Andreno 200 und PowerVR 530/535 sind die erste GPU-Generation (OpenGL ES 2.x) für die HDPI-Auflösung. Sie können einen Vollbildmodus mit 60 FPS nicht mit einer einfachen Textur neu zeichnen.
Ich habe GPUBench geschrieben, um die Leistung der Shader zu testen, und es ist auf diesen GPUs sehr schlecht. Die zweite Generation (Andreno 205, Powervr 540) ist weitaus besser.
Heute versuche ich, Fragment Shader mit ein oder zwei Operationen zu minimieren. Sie können versuchen, Ihren Shader zu optimieren, da GLSL-Compiler schlecht sind (auf mobilen Plattformen).
Hinweis: Lesen Sie für powervr gpu dieses Dokument . PVRUniSCo Editor kann Zyklen berechnen, die in Shadern verwendet werden.
Meine Stärken:
quelle