Durch Hinzufügen einer einfachen Mischung () wird die Framerate zerstört

7

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;
EboMike
quelle
Wissen Sie, dass Nebel nicht linear zur Tiefe ist? Wenn Sie keine Angst haben, dem Shader eine Pow-Funktion hinzuzufügen, sollten Sie versuchen, ihn realistischer zu gestalten;)
Notabene
@notabene: Ich bin mir dessen bewusst, aber da es in diesem Beitrag darum geht, wie einfach mix()die Framerate getötet wurde, war ich nicht zu geneigt, eine zu werfen pow, um sie zu beenden.
EboMike

Antworten:

5

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:

  • Die Droid-GPU ist aufgrund der Füllrate langsamer als Andreno 200
  • 30 FPS für Andreno 200 sind gut
  • 20 FPS für Droid ist gut
  • Sie können Ihre Szene in einem kleineren FBO rendern und auf einem Bildschirm zeichnen (der FBO-Wechsel ist jedoch teuer).
  • Fragment-Shader müssen sehr kurz sein.
Ellis
quelle
Du brichst mir das Herz! Was ist mit dem HTC Evo? Wäre der Adreno 200 nicht zumindest in der Lage, damit umzugehen? Selbst für eine schwache GPU scheint das unangemessen erbärmlich.
EboMike
Mein Ziel sind mindestens 30 fps für Droid und EVO. Ich erinnere mich vage an Spiele wie Backbreaker, die ziemlich gut aussehen (seit einer Weile, seit ich sie gesehen habe, könnte ich mich irren). Was ist das Geheimnis hier? Ich habe keine Überzeichnung, ich verwende kaum Alpha-Blending und dieser Shader ist primitiv. Hast du irgendeine Idee? (Übrigens, wird die Antwort in ein paar Stunden akzeptieren, keine Sorge :))
EboMike
30 FPS für Droid oder EVO sind sehr schwierig. Diese GPU haben eine sehr niedrige Füllrate.
Ellis
Ich weiß nichts über mobile Grafikchipsätze, aber ich kann nicht anders, als zu bemerken, dass Sie den interessantesten Teil nicht erklärt haben. Warum verringert eine einzelne Zeile die Leistung so dramatisch? Ist es wirklich ein langsamer Mischbetrieb?
Nevermind
2
Ich habe es nicht ausprobiert, aber Sie können "PVRUniSCo Editor" für GLSL-Anweisungszyklen suchen.
Ellis