Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Mai 18, 2024 16:51

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Verständnisfragen zu Shadern
BeitragVerfasst: Sa Okt 06, 2012 10:48 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: Sa Okt 06, 2012 11:12 
Offline
DGL Member

Registriert: Mo Okt 01, 2012 13:21
Beiträge: 5
Programmiersprache: Delphi, Python
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: Sa Okt 06, 2012 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: Sa Okt 06, 2012 16:21 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: So Okt 07, 2012 01:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
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.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: Mo Okt 08, 2012 02:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
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.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: Mo Okt 08, 2012 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hm, hast Recht. Warum hab ich mir dann die Mühe gemacht und das selbst implementiert?! xD

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfragen zu Shadern
BeitragVerfasst: Di Okt 09, 2012 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]