![]() |
Conditionals im (Cg-) Shader
Hallo liebe Experten,
ich habe mal eine Frage zu Shadern im allgemeinen, die mir schon länger auf der Zunge brennt: Ich möchte gerne in meinem Shader "Flags" setzen, welche Features eingeschaltet sind und welche nicht. z.B. möchte ich über die Anwendung steuern, ob er die Lightmap auswerten soll oder eben nicht. Bisher habe ich das so gemacht, dass ich dem Shader über eine boolschen uniform mitteile, ob er die Lightmap benutzen soll oder nicht: Shader:
Code:
Delphi:
fragmentOUT main(fragmentIN IN,uniform bool uselightmap) {
... .. if (uselightmap) { OUT.Color.rgb = OUT.Color.rgb * f4tex2D(lightmap,tex_coord) ; } }
Delphi-Quellcode:
cgGLSetParameter1f(FParamHandle,value);
Jetzt habe ich schon oft gehört, dass das nicht gerade performant sein soll (und ist :mrgreen:), da ja die uniform variable dauernd zum Shader übertragen wird und im Shader ein branching angestossen wird. Welche Möglichkeiten gibt es denn und benutzt ihr, um solche "Flags" zu setzen, wenn man in einem Shader einzelne "Schalter" setzen will? Ist es wirklich die einzige und beste Möglichkeit, für jegliche vorkommende Variante (Lightmap an, Lightmap aus, Normalmap an, Normalmap aus usw.) eine eigene Shader-Variante zu kompilieren und dann einzusetzen? Ich finde das sehr umständlich und der Wartungsaufwand ist ja immens, wenn man viele solcher Flags hat und dann nachträglich bei einer Veränderung jede Variante umschreiben muss... P.S.: Ich benutze kein CgFX-Schema, sondern getrennte Vertex- und Fragment-Shader, somit kann ich keine "Techniques" verwenden. |
Re: Conditionals im Cg-Shader
Zitat:
Ich erinnere mich z.B. an Battlefield 2. Da wurde nach Änderung der Grafikeinstellungen immer reichlich lange mit Ladebalken gewerkelt, mit dem Label "Shader werden optimiert". Ich vermute da hinter genau oben genanntes, es ist also denke ich eher kein bad-practice. Im gamedev Forum gab es dazu auch schon mal irgendwo einen Thread, in dem der Tenor ähnlich war, wenn ich mich nicht böse irre. Wenn man es wirklich geschickt anstellt, kann man Shader ja in Code-Fetzen zerlegen, die in verschiedensten Kombinationen zusammen gesetzt laufen können. Dann könnte man sich zur Runtime im Speicher seinen dynamischen Shader zusammen würfeln, ohne vorab zig einzelne, für jeden möglichen Fall separate anlegen zu müssen. *) Ich hab auf gamedev hier und da aufgeschnappt, dass man in einigen Fällen mit Lerp() Branching-ähnliches Verhalten bekommen kann, und dies etwas flotter wäre. Frag mich aber grad nicht nach Details! Das könnte Pipeline-schonender sein, wenn ich mal mutig Mutmaßen soll. Was man aber nicht wirklich verhindern können wird ist, dass immer alle Branches auch ausgeführt werden - zumindest so lange nicht jedes Pixel seine eigene ALU+Caches hat :stupid: |
Re: Conditionals im Cg-Shader
Ahhh, ich wusste doch, dass DU mich selbst in der Nacht nicht im Stich lässt :cheers:
Zitat:
So funktionieren wohl auch Mental Mill und co., hm? :) Nur...wie macht man es dann am Besten mit der Parameter-Übergabe. Die bleibt ja im Hauptprogramm und wenn das auch dynamisch sein sollte, welche Parameter im Hauptprogramm an den Schattierer übergeben werden, kann das doch ziemlich langsam werden, oder liege ich da falsch? Immerhin kann ich dann ja die Parameter-Übergabe nicht "hardcoden", sondern muss mir in den Shader-Apply-Routinen die aktuellen Parameter und deren Typen auch zusammensuchen und übergeben...mhm... Zitat:
Wegen "Branching = nono"... Ist es inzwischen nicht schon so, dass die neueren GTX-Karten nicht mehr alle Varianten durchgehen, sondern nur noch die, die gebraucht werden? Aber im Allgemeinen stimmt das ja schon...irgendwie wie in der Steinzeit...aber das macht irgendwie auch Spass :mrgreen: |
Re: Conditionals im Cg-Shader
Zitat:
Zitat:
Zitat:
(Man könnte auch eine Textur missbrauchen, und in diese sämtliche Parameter werfen, und mit indizierten Lookups sind die im Shader super-flott verfügbar. Wenn diese nur so 16x16 Pixel groß ist, tut das ständige Locken auch nicht SO arg weh. Müsste man einfach mal ausprobieren.) Zitat:
Zitat:
Zitat:
|
Re: Conditionals im Cg-Shader
Zitat:
Zitat:
![]() Zitat:
Gibt es da eventuell etwas vergleichbares? Mhm..muss ich doch mal danach suchen. Ich merke gerade deutlich, wie viel mir eigentlich noch von dem Kram fehlt... Blackfin is now very busy lerping the Pusselkrams |
Re: Conditionals im Cg-Shader
Zitat:
Zitat:
Zitat:
Zitat:
(Wobei ich eher in Richtung Stückel-Shader tendieren würde muss ich zugeben.) Viel Erfolch! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz