Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Um gleich auf den Punkt zu kommen:
Ich programmiere grad ein bissl mit Bumpmapping per GLSL rum und versuch, sowohl optisch als auch performancebezogen zu optimieren. Dabei ist mir etwas sehr merkwürdiges aufgefallen, das ich mir nicht erklären kann.
Es handelt sich um folgende Zeilen (teilweise Pseudocode) im Fragmentshader:
Zitat:
uniform bool UseSpecular; //Diese Variable wird von Delphi aus beschrieben, im vorliegenden Fall IMMER TRUE!
main {
if (UseSpecular == true) { Berechnungen_mit_Specularlighting; } if (UseSpecular != true) // oder einfach "else" { Berechnungen_ohne_Specularlighting; }
}
Wenn ich die Szene so rendere, hab ich knapp 250 fps. Ziemlich wenig, dachte ich mir, und hab ein bissl gesucht. Irgendwann hab ich dann einfach mal von der ersten if-Abfrage bis zur zweiten (eingeschlossen) ausgeklammert. Es sollte sich also nix verändern, es wird ja nur auf zwei if-Abfragen verzichtet.
Aber, wie um mich zu ärgern, hab ich auf einmal 100 fps mehr (in Worten: Einhundert!). Das ist mir unbegreiflich, es werden ja nur zwei if-Abfragen gespart. Bitte klärt mich jemand auf, bzw bestätigt mich in meinem Verdacht, dass wieder mal die Treiber schuld sind! Dann trenne ich einfach in zwei Shader-Programme. Aber es geht ja auch ums Prinzip.
Danke
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Je nach Länge des Blockes wird entweder beides ausgeführt oder ein dynamischer Sprung eingefügt, was noch schlimmer ist. Schau dir mal den generierten ARB_fp Text an (NVEmulate). Idealerweile sollte der Treiber hier zwei Shader bereithalten und je nach uniform Einstellung die richtige Version auswählen, was aber leider nicht passiert. In D3D geht das sogar mit Schleifen ab PS 2.0 . In Cg kann man Parameter als "literal" definieren, so dass der Shader bei Veränderung dieser Variable aktualisiert wird.
Am besten machst du das über #define und #ifdef was leider unschön ist und verwaltest die beiden Shader selber. Erschwerend kommt die lange Kompilierungszeit der Shader hinzu, so daß man da nicht viele Kombinationen kompilieren kann.
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Danke für die schnelle Antwort. Dann werd ich erstmal den Shader zweiteilen.
Aber wie schon erwähnt, für große Anwendungen ist das natürlich kagge. Ich werd bezeiten einen Wiki-Admin sagen, dass er das in mein Tutorial integrieren soll (ich darf das ja ned ). Wenn ichs ned vergess...
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.