in eine textur kopiert und dann an den shader übergeben.
Empfehlenswert scheint es zu sein, die Szene zuerst ohne Texturen und sonstigen SchnickSchnack zu Rendern. In einer Präsentation zur Technik bei Crysis wurde das erklärt. Link muss ich nachreichen.
Auf jeden Fall haben die damit 'alles' gemacht. Angefangen beim Shadowmapping, über die Sichtbarkeitsprüfung des Wassers (welches nämlich mit dem Betrachter wandert, also nicht im Worldspace liegt) bis hinzu den athmosphärischen Effekten (Nebel und so zeug). War ziemlich hart zu lesen, für einen fast-Laien wie mich.
schönen Sonntag noch!
damadmax
_________________ 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"
Der Z test kann voher statfinden (Early Z), aber der eigendliche Z test findet nach dem fragmentshader stat.
In dem Fall der Softpartikel gibt es einfache (aber unsinnige) Lösungen:
Die Partikel werden etwas zur kammera verschoben. Wenn man dies aber genauer betrachtet macht es keinen sinn.
Wenn in ein FBO gerendert wird, ann man einen textur als Z buffer verwenden. Wenn Partikel aktiv sind macht das schreiben dort hin keinen sinn, so das man stat dessen im shader daraus lesen kann und so die entfernung vom Partikel zum hintergrund berechnen kann. Dies ist aber auch nur für kurze entfernungen sinvoll und bringt nur marginal bessere ergebnisse als stat dessen eine größere anzahl von partikeln zu rendern.
Lesen des Z Buffers im Fragmentshader ist nur möglich wenn in ein FBO gerendert wird (MSAA macht es noch komplizierter):
1. Scene rendern. Der Z-Buffer und der Colorbuffer sollten als rectangle textures implementiert werden. letzterer kann auch ein GL_RGBA_16F rendertargtet für HDR sein. Ein Stencilbuffer ist nur auf nvidia karten möglich da ATI Karten kein gepackten Stencil + Z als texturformat unterstützen. Alternative: (mit einem PBO) Den Z Buffer in eine rectangle Textur kopieren.
2. Die Z Buffer Texture binden im fragmentshader lässt sich die textur mit gl_FragCoord.xy auslesen. Allerdings muss der Z Buffer Wert zurück als entfernung umgerechnet werden.
In diesem topic auf opengl.org habe ich passenden code gepostet (Der eigendlich für deferred rendering gedacht ist):
http://www.opengl.org/discussion_boards ... 36&fpart=1
Nein kopieren geht auch ohne FBO. allerdings kostet das kopieren etwas Zeit. Am schnellsten geht das kopieren mit hilfe eines PBO. Wenn man allerdings in ein FBO rendert muss man zum schluss wiederum in den Framebuffer kopieren (was nur sinn macht wenn man ein postprocessing durchführt)
Zumindest in DirectX 10 kann der pixelshader den alten z-wert im buffer lesen, und auch den z-wert des pixels anpassen.
http://ati.amd.com/developer/samples/DepthExplosion.html http://gamedev.de/index.php?name=News&file=article&sid=182 The sample uses 1.4 pixel shaders to render depth sprites with "texdepth" instruction. The "texdepth" instruction in 1.4 pixel shaders allows to overwrite polygons depth information with values computed in the shader as (r5.r / r5.g).
Das sollte heißen dass es die neuen Grakas jedenfalls können. Und da zumindest von NVidia extesions zu dem meisten Dx10 Fähigkeiten vorliegen könnte es also auch mit OGL gehen.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
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.