Gamestudio Links
Zorro Links
Newest Posts
Change chart colours
by 7th_zorro. 05/11/24 09:25
Data from CSV not parsed correctly
by dr_panther. 05/06/24 18:50
Help with plotting multiple ZigZag
by degenerate_762. 04/30/24 23:23
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (VoroneTZ, TipmyPip), 1,333 guests, and 0 spiders.
Key: Admin, Global Mod, Mod
Newest Members
firatv, wandaluciaia, Mega_Rod, EternallyCurious, howardR
19050 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
restore position from depth #294250
10/17/09 14:43
10/17/09 14:43
Joined: Jan 2007
Posts: 1,619
Germany
Scorpion Offline OP
Serious User
Scorpion  Offline OP
Serious User

Joined: Jan 2007
Posts: 1,619
Germany
hello everyone,

I am storing the distance to the camera (length of the position in viewspace) in a fp-texture and want to restore the position for each pixel later. To do so I get the projected point at the distance of 1, normalize it (So I've got the 'direction') and scale it by the looked up depth.
This works all in all well. If I output the position as color, the grid is aligned to the camera axes and stays at its position (so it's cameraspace, isn't it?)


So it looks like without the matViewInv applied

Now I thought it would be easy, if I have the coordinates in cameraspace it's enough to multiply them with matViewInv to get everything alright. But that didn't worked out and I have no idea what could be wrong.

Here is the relevant code:
-get the depth
Code:
//VS:
OUT.vPos = mul(IN.pos, matWorldView);

//PS:
OUT.depth = float4(length(IN.vPos), 0.f, 0.f, 1.f);



-try to restore it
Code:
float depth = tex2D(depthMap, IN.tex).x;
float3 viewDir = float3(IN.tex.xy*2-1, 0.5773);//tan(camera.arc*0.5)
viewDir.y *= 0.75;//768/1024 = aspect
float4 pos = float4(normalize(viewDir)*depth, 1.f);
pos = mul(pos, matViewInv);
return pos;



I'm pretty desperate right now, because I tried to find a solution for it for a few days now... I hope you can help me with that. Thank you =)
Scorpion

Re: restore position from depth [Re: Scorpion] #294970
10/22/09 09:54
10/22/09 09:54
Joined: Jan 2007
Posts: 1,619
Germany
Scorpion Offline OP
Serious User
Scorpion  Offline OP
Serious User

Joined: Jan 2007
Posts: 1,619
Germany
*cough* Anyone? I know here are some guys around here who know this stuff, so could you please take a look at it?

Re: restore position from depth [Re: Scorpion] #294978
10/22/09 11:00
10/22/09 11:00
Joined: Mar 2006
Posts: 2,252
Hummel Offline
Expert
Hummel  Offline
Expert

Joined: Mar 2006
Posts: 2,252
da ja sonst niemand an einer Lösung interessiert zu sein schein machen wirs gleich mal in Deutsch^^
Um Klarheit zu schaffen: du willst die Vertex-Position in Worldspace anhand von der Tiefe ermitteln?

Das hab ich schon in meiner Wavefield Demo verwendet, sollte also kein Prob sein...

Erstmal muss klar sein, dass es einen Unterschied zwischen "Depth" und dem "Distance to View" Term gibt. "Depth" erhält man aus dem .z oder .w Wert der Vertexposition im WorldViewProj-Raum. Den anderen hingegen aus der Länge vom Vektor der von der ViewPos in Worldspace auf die VertexPos in Worldspace zeigt.
Der "Depth"-Wert ist eher als Vektor zu verstehen, der vom entsprechenden Pixel des Views und nicht vom Zentrum auf das Vertex zeigt. Guckst du also senkrecht auf eine glatte Fläche haben die Depth-werte aller gerenderten Pixel den gleichen Wert, im Gegensatz zu den Distance-Werten.

Also rekonstruierst du die WorldPos nicht vom Depth sondern vom Distance-Wert(folgend nurnoch "DWert").
Dazu renderst du also den DWert der Szene in ein RT des Formates 14 oder in einen einzelnen Kanal eines 14444-RTs (wenn du die anderen Kanäle ebenfalls benötigst). Ich hab in meinem Fall für den Richtungswert einfach ein zweites View mit gleichen Winkelwerten wie der Kamera verwendet (Pos ist egal), welches ausschließlich eine Box rendert indem es sich befindet. Der Box gibst du dann ein Material welches die normalisierte Variante vom DWert zu den 8 Vertices enthält, also die Richtung. Das Ergebnis renderst du in einen Kanal vom Format 12 oder eben 12222(14 ist an der Stelle glaube nicht nötig).

Im PP-Effekt kannst du dann die WorldPos rekonstruieren indem du einfach folgendes machst: WorldPos=ViewWPos+Richtung*DWert;
Du folgst also von der View-Position aus der Richtung über die entsprechende Distanz.

Dannach kannst du dann bei Bedarf auch Depth per Multiplikation von WorldPos mit matWorldViewProj ermitteln.

Mit diesem Vorgehen kann man einige MRT-Kanäle sparen, was durchaus essenziell sein kann.

MfG.

...hoffe das war was du wolltest^^

Re: restore position from depth [Re: Hummel] #294988
10/22/09 12:18
10/22/09 12:18
Joined: Jan 2007
Posts: 1,619
Germany
Scorpion Offline OP
Serious User
Scorpion  Offline OP
Serious User

Joined: Jan 2007
Posts: 1,619
Germany
Hi Hummel, erstmal danke für die schnelle Antwort =)

Von w oder z wollte ich eigentlich keinen Gebraucht machen...Entschuldige meine Schlampigkeit^^

Deine Methode mit einem Lookup find ich auf jeden Fall super und sie scheint kaum etwas extra zu kosten werde ich mir bestimmt nochmal ansehen. Aber ich muss sagen ich bin zur Zeit nur am rumspielen und sehe, was ich so erreichen kann. Deswegen hab ich versucht, den Punkt in Viewcoordinaten zu bekommen (könnte z.B. für deferred Rendering Geschwindigkeit raushauen). Die eigentliche Frage im meinem Post war aber wohl eher: wieso tut matViewInv nicht das Gegenteil von matView? Nämlich vom Viewspace zurück in den Worldspace zu transformieren. Es müsste doch dann auch klappen, Screencoordinaten(mit z) direkt in den Worldspace umzuwandeln - auch wenn Matrixmultiplikationen ja eeher langsamer sind^^

edit: oouuppss! >.< Kein Wunder, dass hier keiner schreibt, wenn ich nur Mist von mir gebe... inverse Matrizen sind nicht exakt das, was ich dachte. Das macht jetzt wenig Sinn, weiter übers Problem zu reden, wenn da schon nen Problem drinsteckt... O.o

Last edited by Scorpion; 10/22/09 12:27. Reason: Die Schule ist schuld!
Re: restore position from depth [Re: Scorpion] #294992
10/22/09 12:43
10/22/09 12:43
Joined: Mar 2006
Posts: 2,252
Hummel Offline
Expert
Hummel  Offline
Expert

Joined: Mar 2006
Posts: 2,252
bedenke das vPos so wie du es in den VShader bekommst im ObjectSpace vorliegt, aber ansonsten ist es schon richtig was du schreibst-nur transformierst du eben vPos wieder in ObjSpace wenn du nach matView matViewInv anwendest wink

PS: die Schule ist immer Schuld tongue

Re: restore position from depth [Re: Hummel] #294996
10/22/09 13:22
10/22/09 13:22
Joined: Jan 2007
Posts: 1,619
Germany
Scorpion Offline OP
Serious User
Scorpion  Offline OP
Serious User

Joined: Jan 2007
Posts: 1,619
Germany
*verwirrtbin*
Wenn das jetzt doch stimmt mit der inversen Matrix, dann würde mein Beispiel doch funktionieren.

so weit ich das sehe, sollte es - vorausgesetzt das mit den Matrizen stimmt =) - dann im Worldspace sein, da ja nur die Viewtransformation rückgängig gemacht wird. Mit dem Objektspace hab ich gar nichts mehr zu tun. Und nochwas spricht dagegen: wenn ich es versuche, bewegen sich die Farben(welt xyz->rgb), anstatt wie ne Textur klebenzubleiben.

Code:
|<---|
World View Proj



Re: restore position from depth [Re: Scorpion] #295003
10/22/09 13:52
10/22/09 13:52
Joined: Mar 2006
Posts: 2,252
Hummel Offline
Expert
Hummel  Offline
Expert

Joined: Mar 2006
Posts: 2,252
^^wenn die VertexPos im WorldSpace vorliegt und sich die Faben bewegen ist doch alles richtig...vlt. schickst du mir heute abend dein Test-Projekt einfach mal und wir aktivieren ICQ laugh

Re: restore position from depth [Re: Hummel] #295091
10/22/09 22:38
10/22/09 22:38
Joined: Jun 2004
Posts: 655
to your left
BoH_Havoc Offline
User
BoH_Havoc  Offline
User

Joined: Jun 2004
Posts: 655
to your left
depth:
Code:
//Vertex Shader:
Output.Position = mul(inPos, matWorldViewProj);
Output.Position2D = Output.Position;

//Pixel Shader
depth = ((PSIn.Position2D.z-0)/maxDepth); //maxdepth = camera.clip_far



reconstruct world space position from depth:
Code:
float4x4 matMtl : matWorldViewProjInv;

//Pixel Shader
   //compute world position
   float4 vp = float4(inTex.xy * float2(2, -2) - float2(1, -1), depth, 1);
   float4 v = mul(vp, matMtl);
   float3 position = v.xyz/v.w;
	
   //calculate ROUGH normals from position
   float3 normal = cross(ddx(position),ddy(position));



might not be the fastest method, but works just fine laugh


Shade-C EVO Lite-C Shader Framework
Re: restore position from depth [Re: BoH_Havoc] #295183
10/23/09 11:34
10/23/09 11:34
Joined: Jan 2007
Posts: 1,619
Germany
Scorpion Offline OP
Serious User
Scorpion  Offline OP
Serious User

Joined: Jan 2007
Posts: 1,619
Germany
I wasn't able to enter the forum yesterday anymore somehow, so here I am again.

@hummel wäre es auch okay, wenn ich heute abend drauf zurückkomme?

@BoH_Havok I don't fully understand that one...i think vp are the projection coordinates, but if I remember right they are in the 0..1 range, but you're converting them to -1..1, so: why?

Re: restore position from depth [Re: Scorpion] #295191
10/23/09 12:27
10/23/09 12:27
Joined: Jun 2008
Posts: 151
Ukraine
XD1v0 Offline
Member
XD1v0  Offline
Member

Joined: Jun 2008
Posts: 151
Ukraine
@Scorpion you probably read my thoughts, i also wanted to know how to restore the world coordinate, basically you did my life much easier cool
Quote:
but you're converting them to -1..1, so: why?

I guess this is projected coordinates to screen from -1 to 1 (left to right and from down to top)

@BoH_Havok thank you for this code i was searching for his wink

Last edited by XD1v0; 10/23/09 12:41.

A7 Commercial cool
Celeron 1700, GeForce 5500 FX 256mb, 1 Gb Ram
Page 1 of 2 1 2

Moderated by  Blink, Hummel, Superku 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1