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

Aktuelle Zeit: So Jul 20, 2025 14:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Depth to Position
BeitragVerfasst: Di Mai 08, 2012 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Di Mai 08, 2012 22:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du brauchst die Inversen der Matrizen, du willst ja zurück rechnen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 06:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Die Projection is bereits invertiert, nur wenn ichs auch mit der ModelView mache dann ist alles schwarz...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 06:42 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 10:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wo ist die modelview matrix ?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 11:18 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
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.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
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.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 16:01 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
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..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Mi Mai 09, 2012 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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!!

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Do Mai 10, 2012 07:05 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
probier doch mal meinen code aus...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Do Mai 10, 2012 07:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Thmfrnk hat geschrieben:
probier doch mal meinen code aus...


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

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Do Mai 10, 2012 11:01 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
mhh bei mir sieht das so aus:
Dateianhang:
DepthToPos.PNG [181.14 KiB]
Noch nie heruntergeladen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Do Mai 10, 2012 11:20 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
beachte das es einen unterschied macht ob du InvViewMat * Vertex oder Vertex * InvViewMat rechnest...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Depth to Position
BeitragVerfasst: Do Mai 10, 2012 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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 <.<

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.

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