Andy90 hat geschrieben: ↑04.09.2024, 20:32
Jetzt ist nur meine Frage kann ich die objekte ganz normal auf die shadowmap rendern, also mit den normalen render funktionen und shadern oder sollte ich dafür extra shader erstellen?
Also ich verwende einfach die ganz normalen Shader die ich zum Rendern auch schon benutze. Was funktioniert und einfach ist, aber nicht unbedingt toll. Besser wäre es natürlich, nur die Tiefenwerte rauszurechnen.
"DepthOnlyOutput" bei OpenGL hab ich noch nie gehört, mag aber gerne daran liegen, dass ich nie explizit danach gesucht habe. Aber ich denke auch damit kann es nicht mit einer Zeile Code getan sein. Mal schauen, was für vernünftiges Shadowmap-Rendering passieren muss:
- Shader brauchst du ja trotzdem garantiert. Vertex-Shader berechnen ja erst die Position, aber auch Fragment Shader können ja Fragmente discarden. Sie könnten ggf. auch die Tiefe eines Fragmentes anhand einer Textur verändern. Im Allgemeinen wirst du also andere Shader brauchen.
- Bei mir (ist wohl Sache des Grafikkartentreibers?) ist der Shadercompiler sehr gut darin ungenutze Dinge rauszuschmeißen. Es sollte also kein Problem sein quasi den identischen Shader Code zu kompilieren aber irgendwie verständlich zu machen, dass man nur am Tiefenwert interessiert ist. Ob man jetzt den Shader minimal anpasst (Ausgabefarbe auf einen konstanten Wert setzen) oder irgendeinen OpenGL Befehl benutzt, ist zweitranging, das wird beides irgendwie gehen und sehr ähnlich sein.
- Trotzdem muss man den Shader 2 mal kompillieren und entsprechend anders optimieren. Ich kann mir nicht vorstellen, dass OpenGL jeden Shader absolut immer 2 mal kompilliert nur für den Fall, dass man den ja mal für Shadow-Maps benutzen kann. Das wird man also wohl selber machen müssen.
- Schlussendlich muss man ja auch Texturen und Buffer etc. setzen. Manche davon sind für die Tiefeninformationen egal. Aber selbst wenn man 2 Renderjobs an OpenGL schickt macht es ja einen großen Unterschied, ob man zwischendrin eine Textur setzt, egal ob sie schlussendlich verwendet wird oder nicht. Für Shadowmaps wirst du am Ende vermutlich sehr viel mit dem selben "Material" rendern können, was Clientseitig einfach effizienter sein sollte.
Und schlussendlich willst du ja vielleicht für die Shadowmap auch ganz andere Dinge rendern. ViewFrustum Culling mit dem Kamerafrustum wäre z.B. eine schlechte Idee, vlt. willst du ein paar dynamische Objekte weglassen oder aus Performance-Gründen andere Geometrien als Proxy rendern. Das ist jetzt schon ziemlich optional, aber es verdeutlicht die Tatsache das Shadowmap rendern ein komplett separater Render-Pass ist, inklusive anderer Shader, anderer Texturen / Ressourcen und ggf. anderer Meshs.
Ich ignoriere das wie gesagt einfach, was definitiv funktioniert, aber halt nicht schnell ist. Ich würde es demnächst Umstellen auf ein System wo man oben genannte Tatsache vernünftig abbildet und dann damit effizient rendern kann.