DGL
https://delphigl.com/forum/

Depth to Position
https://delphigl.com/forum/viewtopic.php?f=20&t=10428
Seite 1 von 2

Autor:  yunharla [ Di Mai 08, 2012 19:49 ]
Betreff des Beitrags:  Depth to Position

Moinsen,

Bin gerade am Rumrätseln wie ich meinen Depthbuffer in die Vertexposition zurückrechne, meine bisherigen Ergebnisse sind leider nicht so richtig.
Jemand ne Idee wie es richtig geht?
Code:
  1.  
  2. uniform sampler2D CameraDepthMap;
  3. uniform vec4 DepthClipping;
  4. uniform mat4 CamProjectionMatrix;
  5. uniform mat4 CamModelViewMatrix;
  6.  
  7. float LinearizeDepth(float z,float n,float f)
  8. {
  9.   return (f + n - z * (f - n));
  10. }
  11.  
  12.  
  13. void main()
  14. {
  15.    
  16.     /*
  17.     vec4 uv = texture2D( UVBuffer, gl_TexCoord[0].st);
  18.     vec2 unpacked = vec2(uv.x,uv.z);
  19.     unpacked.x += floor(uv.g * (16.0)) / 16.0 / 256.0;
  20.     unpacked.y += (uv.g - (floor(uv.g * (16.0)) / 16.0)) / 256.0;*/
  21.  
  22.  
  23.     float cdm = LinearizeDepth(texture2D( CameraDepthMap, gl_TexCoord[0].st).x,DepthClipping.x,DepthClipping.y);
  24.     vec4 screenPos = vec4(gl_TexCoord[0].x, gl_TexCoord[0].y, 1.0, 1.0) * 2.0 - 1.0;
  25.     screenPos.z = cdm;
  26.     vec4 viewPosition = screenPos*(CamProjectionMatrix*CamModelViewMatrix);
  27.  
  28.     viewPosition /= viewPosition.w;
  29.  
  30.     vec3 vertexPosition = viewPosition.xyz;
  31.  
  32.     gl_FragData[0] =vec4(0.0,0.0,0.0,1.0);
  33.     gl_FragData[0].rgb = vertexPosition;
  34.  
  35.  
  36. }
  37.  


Eingabe:
Bild

Ausgabe:
Bild

Autor:  Coolcat [ Di Mai 08, 2012 22:00 ]
Betreff des Beitrags:  Re: Depth to Position

Du brauchst die Inversen der Matrizen, du willst ja zurück rechnen.

Autor:  yunharla [ Mi Mai 09, 2012 06:23 ]
Betreff des Beitrags:  Re: Depth to Position

Die Projection is bereits invertiert, nur wenn ichs auch mit der ModelView mache dann ist alles schwarz...

Autor:  Thmfrnk [ Mi Mai 09, 2012 06:42 ]
Betreff des Beitrags:  Re: Depth to Position

hier bissl Code wie ich meine 3D Position zurück rechne:

Code:
  1.  
  2.     vec2 texcoord = vec2(gl_TexCoord[0]);      
  3.         vec4 vColor = texture2D(colorMap, texcoord);       
  4.         float fDepth = texture2D(depthMap, texcoord).x;            
  5.         vec4 vNormal = texture2D(normalMap, texcoord);             
  6.         vNormal.xyz = vNormal.xyz * 2.0 - 1.0; 
  7.         vec4 vVertex;      
  8.         vVertex.xy = gl_TexCoord[0].st  * 2.0 - 1.0 ;                          
  9.             vVertex.z = fDepth * 2.0 - 1.0;            
  10.         vVertex.w = 1.0;
  11.         vVertex =  proM * vVertex;         
  12.         vVertex /= vVertex.w;
  13.          
  14.  


proM ist die invertierte Projektionsmatrix der Camera.

Autor:  TAK2004 [ Mi Mai 09, 2012 10:10 ]
Betreff des Beitrags:  Re: Depth to Position

Wo ist die modelview matrix ?

Autor:  Thmfrnk [ Mi Mai 09, 2012 11:18 ]
Betreff des Beitrags:  Re: Depth to Position

hups hab was vergessen:

Code:
  1.  
  2.     vec2 texcoord = vec2(gl_TexCoord[0]);      
  3.         vec4 vColor = texture2D(colorMap, texcoord);      
  4.         float fDepth = texture2D(depthMap, texcoord).x;            
  5.         vec4 vNormal = texture2D(normalMap, texcoord);            
  6.         vNormal.xyz = vNormal.xyz * 2.0 - 1.0;
  7.         vec4 vVertex;      
  8.         vVertex.xy = gl_TexCoord[0].st  * 2.0 - 1.0 ;                          
  9.         vVertex.z = fDepth * 2.0 - 1.0;            
  10.         vVertex.w = 1.0;
  11.         vVertex =  proM * vVertex;        
  12.         vVertex /= vVertex.w;      
  13.  
  14.         vec4 vEye;                 
  15.         vEye.xyz   = vVertex.xyz  * 1.00001;     //ohne dem kommt bei mir irgendwie murks raus.. warum auch immer
  16.     vec4 posWorld = InvViewMat * vec4(vEye.xyz, 1.0);       //hier die inverse Modelviewmatrix
  17.  
  18.  

Autor:  TAK2004 [ Mi Mai 09, 2012 12:59 ]
Betreff des Beitrags:  Re: Depth to Position

Ich hab von Positions rekonstruktion, aus einem Tiefenpuffer, keine Ahnung aber ich hab mal ein bisschen gegoogelt und hab ein paar Fehler in dem Shader gefunden.
http://mynameismjp.wordpress.com/2009/03/10/reconstructing-position-from-depth/

Der erste Fehler liegt in der Berechnung von Y, da UV Koordinaten immer von unten links als 0 ausgehen, ist dein Y spiegelverkehrt.
Aus
Code:
  1. vVertex.xy = gl_TexCoord[0].st  * 2.0 - 1.0 ;

wird
Code:
  1. vVertex.x = gl_TexCoord[0].x  * 2.0 - 1.0 ;
  2. vVertex.y = (1.0-gl_TexCoord[0].y)  * 2.0 - 1.0 ;


Die Z Komponente ist auch falsch.
Folgende Zeile kann komplett raus.
Code:
  1. vVertex.z = fDepth * 2.0 - 1.0;


Folgendes kann raus.
Code:
  1. vec4 vEye;                
  2.         vEye.xyz   = vVertex.xyz  * 1.00001;     //ohne dem kommt bei mir irgendwie murks raus.. warum auch immer
  3.     vec4 posWorld = InvViewMat * vec4(vEye.xyz, 1.0);       //hier die inverse Modelviewmatrix

Die Koordinaten brauchen nicht noch durch den Modelview durchgenudelt werden, da die globalen Positionen verwendet werden und keine lokalen, also ein Gedankenfehler meiner seits.

Autor:  Thmfrnk [ Mi Mai 09, 2012 16:01 ]
Betreff des Beitrags:  Re: Depth to Position

also bei mir funktioniert das so wunderbar.. Nutze das bei DeferredShading und SSAO ohne Probleme..

Warum sollte das hier raus? vVertex.z = fDepth * 2.0 - 1.0;
Nein man will doch die Weltkoordinaten und nicht die im ViewSpace.. die Tiefemap wurde doch aus Kameraperspektive erzeugt.. Daher muss man mit der InverseViewMatrix multiplizieren..

Autor:  Coolcat [ Mi Mai 09, 2012 16:54 ]
Betreff des Beitrags:  Re: Depth to Position

Zitat:
Der erste Fehler liegt in der Berechnung von Y, da UV Koordinaten immer von unten links als 0 ausgehen, ist dein Y spiegelverkehrt.

Öh, wieso das? Liegt das nicht daran wie man die UV-Coords auf die Vertices verteilt?

Zitat:
Die Projection is bereits invertiert, nur wenn ichs auch mit der ModelView mache dann ist alles schwarz...

Du musst beides Invertieren sonst wird das schon mal nix. Ich tippe dann mal auf
Code:
  1. vec4 viewPosition = CamModelViewMatrix*(CamProjectionMatrix*screenPos);

statt
Code:
  1. vec4 viewPosition = screenPos*(CamProjectionMatrix*CamModelViewMatrix);


BTW: Wenn die Matrizen invertiert sind sollte man die Uniforms auch so nennen. Wenn du in einem Jahr nochmal auf deinen Code guckst wirst du mir danken ;)

Autor:  yunharla [ Mi Mai 09, 2012 19:05 ]
Betreff des Beitrags:  Re: Depth to Position

also multipliziere ich die normalisierte Tiefe mit der invertierten Projektionsmatrixe erhalte ich:
Bild
wird das mit der invertierten ModelView multipliziert gibts:
Bild

und wie ihr weiter oben am Screenshot aus dem Radiant seht ist das schlicht falsch!!

Autor:  Thmfrnk [ Do Mai 10, 2012 07:05 ]
Betreff des Beitrags:  Re: Depth to Position

probier doch mal meinen code aus...

Autor:  yunharla [ Do Mai 10, 2012 07:35 ]
Betreff des Beitrags:  Re: Depth to Position

Thmfrnk hat geschrieben:
probier doch mal meinen code aus...


erm .... das ist dein code...

Autor:  Thmfrnk [ Do Mai 10, 2012 11:01 ]
Betreff des Beitrags:  Re: Depth to Position

mhh bei mir sieht das so aus:
Dateianhang:
DepthToPos.PNG [181.14 KiB]
Noch nie heruntergeladen

Autor:  Thmfrnk [ Do Mai 10, 2012 11:20 ]
Betreff des Beitrags:  Re: Depth to Position

beachte das es einen unterschied macht ob du InvViewMat * Vertex oder Vertex * InvViewMat rechnest...

Autor:  yunharla [ Do Mai 10, 2012 17:45 ]
Betreff des Beitrags:  Re: Depth to Position

ok habn fehler gefunden.... offenbar hat die
Code:
  1.  
  2. float LinearizeDepth(float z,float n,float f)
  3. {
  4.   return (2.0 * n) / (f + n - z * (f - n));
  5.  
  6. }
  7.  


zu diesen Ergebnissen geführt <.<

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