DGL
https://delphigl.com/forum/

Depth Buffer lesen oder Z-Wert ändern? [gelöst]
https://delphigl.com/forum/viewtopic.php?f=20&t=7067
Seite 1 von 3

Autor:  elektrokrach [ So Nov 18, 2007 08:14 ]
Betreff des Beitrags:  Depth Buffer lesen oder Z-Wert ändern? [gelöst]

gelöst

Autor:  damadmax [ So Nov 18, 2007 10:05 ]
Betreff des Beitrags: 

Guten Morgähn!!!

den tiefenpuffer habe ich mit
Code:
  1. glCopyTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT, 0,0, ReflectionSize,ReflectionSize, 0);
  2.  

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. :D

schönen Sonntag noch!

damadmax

Autor:  elektrokrach [ So Nov 18, 2007 19:23 ]
Betreff des Beitrags: 

gelöst

Autor:  damadmax [ Mo Nov 19, 2007 14:29 ]
Betreff des Beitrags: 

vorher! sonst würde es ja keinen vorteil bringen.

aber du kannst doch erst deine umgebung rendern, dann die entstandene tiefentextur nehmen und deine partikel damit überblenden.

Autor:  elektrokrach [ Mo Nov 19, 2007 14:34 ]
Betreff des Beitrags: 

gelöst

Autor:  oc2k1 [ Mo Nov 19, 2007 22:16 ]
Betreff des Beitrags: 

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.

Autor:  elektrokrach [ Mo Nov 19, 2007 22:22 ]
Betreff des Beitrags: 

gelöst

Autor:  oc2k1 [ Mo Nov 19, 2007 23:10 ]
Betreff des Beitrags: 

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

Autor:  LarsMiddendorf [ Mo Nov 19, 2007 23:18 ]
Betreff des Beitrags: 

Eventuell ist das hier gemeint:

Bild
http://www.humus.ca/index.php?page=3D&ID=36

Da wird die Entfernung zwischen (der Gerade durch Kamera und Fragment) und (dem Mittelpunkt der Lichtquelle) berechnet.

Autor:  elektrokrach [ Mo Nov 19, 2007 23:35 ]
Betreff des Beitrags: 

gelöst

Autor:  oc2k1 [ Mo Nov 19, 2007 23:53 ]
Betreff des Beitrags: 

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)

Autor:  elektrokrach [ Di Nov 20, 2007 00:05 ]
Betreff des Beitrags: 

gelöst

Autor:  The-Winner [ Di Nov 20, 2007 20:45 ]
Betreff des Beitrags: 

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).

Autor:  elektrokrach [ Di Nov 20, 2007 20:47 ]
Betreff des Beitrags: 

Und wie soll mir das mit OpenGL weiterhelfen?

Autor:  The-Winner [ Di Nov 20, 2007 21:13 ]
Betreff des Beitrags: 

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.

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