Einzelnen Beitrag anzeigen

blackfin
(Gast)

n/a Beiträge
 
#1

Conditionals im (Cg-) Shader

  Alt 18. Mai 2010, 00:45
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:
fragmentOUT main(fragmentIN IN,uniform bool uselightmap) {
...
..

  if (uselightmap) {   
    OUT.Color.rgb = OUT.Color.rgb * f4tex2D(lightmap,tex_coord) ;                          
  }

}
Delphi:
cgGLSetParameter1f(FParamHandle,value);
Jetzt habe ich schon oft gehört, dass das nicht gerade performant sein soll (und ist ), 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.
  Mit Zitat antworten Zitat