DGL
https://delphigl.com/forum/

Verständnisfragen zu Shadern
https://delphigl.com/forum/viewtopic.php?f=20&t=10610
Seite 1 von 1

Autor:  erin [ Sa Okt 06, 2012 10:48 ]
Betreff des Beitrags:  Verständnisfragen zu Shadern

Dies soll zwar ein Forum für Fortgeschrittene sein, aber Shader sind mehr und mehr auch ein Thema für Anfänger wie ich. Deshalb wage ich es, hier zu posten

Also, ich habe einige grundsätzliche Verständnisfragen zu Shadern, mir ist die Infrastruktur nicht so ganz klar. Wenn ich das richtig verstehe, kann die fixed Pipeline an zwei Stellen (die zur Zeit auch schon als "deprecated" gekennzeichnet sind) aufgebrochen und mit eigenem Code, den Shadern, überbrückt werden. Ein Vertex-Shader und/oder ein Fragment-Shader werden zu einem Shaderprogramm verbunden und in die OpenGL-Pipeline eingeklinkt. Das bedeutet ja, dass nur ein einziges Programm mit maximal 2 Shadern aktiv sein kann.

Nun las ich im OpenGL-Redbook, dass man beliebig viele Shader und auch mehrere Shader-Programme bereitstellen kann. Wie passt das zu der Annahme oben? In Wirklichkeit werden ja in einem 3D-Programm die verschiedensten Shader mit jeweils speziellen Funktionen gebraucht, zwischen denen ständig hin- und hergeschaltet wird. Mal werden scharfkantige Objekte gerendert, dann im selben Frame Terrains mit Multitexturing usw. In allen Tutorial-Beispielen, auch im DGL-Tutorial von Sascha Wilms (das ansonsten sehr gut ist), wird immer nur der einfache Fall mit einem Vertex-Shader, einem Fragment-Shader und einem Shaderprogramm vorgestellt.

Ich vermute mal (ohne sicher zu sein), dass je nach Situation das eine oder andere aktiviert bzw. deaktiviert werden muss, sofern man den ganzen erforderlichen "Shader-Stuff" im voraus kompiliert. Aber so ein Shader-Management erfordert ja auch gewisse Strategien, um effektiv und rationell vorgehen zu können. Gibt es dazu Infos? Oder liege ich total verkehrt, und alles kann in ein einziges Shaderpaar gepackt werden?

Autor:  Pivi [ Sa Okt 06, 2012 11:12 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Hi,

Du liegst mit deiner Vermutung schon richtig, dass man alle Shader am Anfang lädt und dann zwischen diesen wechset, je nachdem was gerade gezeichnet werden soll, es kann auch immer nur ein Shader aktiv sein.
Einen großen Shader zu schreiben der alle Aufgaben erledigt (Terrain rendern, Objekte rendern, etc.) ist eher schlecht, wegen den ganzen if-Abfragen die das mit sich bringt. Shader solltem immer so klein wie möglich sein und bestenfalls eine spezielle Aufgabe haben (wie z.B. das Redern von Objekten mit per-pixel-lighting).

Am Sinnvollsten ist es, wenn Du die einen Shadermanager schreibst, also eine Klasse mit der Du Shader laden und verwalten kannst, und die insbesondere sicherstellt, das immer nur ein Shader gebunden ist.

Hoffe ich konnte dir weiterhelfen

Pivi

Autor:  Lord Horazont [ Sa Okt 06, 2012 14:49 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Pivi hat geschrieben:
Am Sinnvollsten ist es, wenn Du die einen Shadermanager schreibst, also eine Klasse mit der Du Shader laden und verwalten kannst, und die insbesondere sicherstellt, das immer nur ein Shader gebunden ist.

Das letzte ist trivial – denn OpenGL erlaubt es garnicht mehr als einen Shader zu binden. Ansonsten ist das so schon korrekt. Ebenso wie man für Texturen die Reihenfolge der Drawcalls so umbauen sollte, dass möglichst wenig Texturwechsel statt finden, sollte man so auch für die Shader optimieren.

grüße

Autor:  erin [ Sa Okt 06, 2012 16:21 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Danke, jetzt sehe ich klarer. Nun heißt es die Ärmel aufkrempeln und ran an die Shader. Ich freu mich auf die Herausforderung.

Vom OpenGL-Redbook bin ich übrigens etwas enttäuscht. Da werden zwar die überholten Funktionen am Rand markiert, aber das Vorgehen ist nach wie vor dasselbe wie vor 5 Jahren. Wer als Beginner von vorne anfängt (was man beim Redbook glücklicherweise nicht muss) und die Randsymbole nicht beachtet, kann in absehbarer Zeit dumm aus der Wäsche gucken, wenn er merkt, dass er auf den falschen Weg geführt wurde.

Sei's drum, alles Gute.

Autor:  Bergmann89 [ So Okt 07, 2012 01:34 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Hey,

noch was zum Thema Shader-Manager. Wir haben bei uns einen großen Shader geschrieben und dann mit Kommentaren eigene IFDEF's eingebaut. Diese IFDEF's ließt der ShaderManager aus, und baut dann daraus die entsprechenden Shader, die zur Laufzeit gebunden werden. Kleines Beispiel: Du willst einen Per-Pixel-Light-Shader mit Texturen, aber nicht alle deine Objekte haben Texturen. Also klammerst du das Textur-Lookup einfach mit einem IFDEF aus. Dem ShaderManager sagst du dann, das er die Shader einmal mit den DEFINES für Texturen und einmal ohne erstellen soll. So kann man das schön alles in eine Datei schreiben und bekommt trotzdem die gewünschten Ergebnisse. So ähnlich sieht das dann aus:

Code:
  1. //im Shader:
  2.   gl_FragColor = (IAmbient + (IDiffuse + ISpecular)/*IFDEF SHADOWMAP*/ * shadow/*ENDIF*/)
  3.     /*IFDEF COLORMAP*/ * texture2D(uColorMap, TexCoord)/*ENDIF*/
  4.     /*IFDEF LIGHTMAP*/ + IEmission/*ENDIF*/;
  5.  
  6. //im ShaderManager:
  7.   fShaderArr[0] := CreateShader([]); //nur Per-Pixel-Light
  8.   fShaderArr[1] := CreateShader(['COLORMAP']); //Per-Pixel-Light mit Textur
  9.   fShaderArr[2] := CreateShader(['COLORMAP', 'LIGHTMAP']); //Per-Pixel-Light mit Textur und Lightmap
  10.   fShaderArr[3] := CreateShader(['COLORMAP', 'LIGHTMAP', 'SHADOWMAP']); //Per-Pixel-Light mit Textur, Lightmap und ShadowMap


MfG Bergmann.

Autor:  damadmax [ Mo Okt 08, 2012 02:31 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Wenn ich mich gerade (aufgrund der fortgeschrittenen Uhrzeit) nicht fürchterlich täusche unterstützt doch der OpenGL Shader Compiler selber schon #ifdef ? Man muss nur mit #define entscheiden was man gerne hätte.

Autor:  Bergmann89 [ Mo Okt 08, 2012 18:49 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Hm, hast Recht. Warum hab ich mir dann die Mühe gemacht und das selbst implementiert?! xD

Autor:  Aya [ Di Okt 09, 2012 10:39 ]
Betreff des Beitrags:  Re: Verständnisfragen zu Shadern

Auch wenn das für den Anfang sicher etwas hoch ist und übertriebener Aufwand wäre - eventuell hilft es ein wenig beim Ideen finden: viewtopic.php?f=13&t=10523

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/