- Home /
World coordinates from NDC - Raycast
Hi! I am doing a Raycast algorithm in the fragment shader in Unity and for that I need the world coordinates of the camera and the coordinates of each pixel. I have the NDC coordinates of each pixel and I am struggling with transforming it back to world coordinates. So far I have multiplied with the custom-made inverse VP matrix, but I think is not working properly because I tried to debug it by mapping X and Y channels with red and green colors as output to see if the coordinates actually change along with the camera, but nothing seems to change.
The current code is : Shader "Custom/Camera" {
SubShader{
Pass{
CGPROGRAM
pragma vertex vert
pragma fragment frag
include "UnityCG.cginc"
uniform sampler2D _MainTex; uniform sampler2D _DepthTex;
struct vertIn {
float4 pos : POSITION;
};
struct vertOut {
float4 pos : SV_POSITION;
};
vertOut vert(vertIn i)
{
vertOut o;
o.pos = mul(UNITY_MATRIX_MVP, i.pos);
return o;
}
float4 frag(vertOut i) : COLOR
{
float imgAsp = _ScreenParams.x / _ScreenParams.y;
float xcord = (((i.pos.x +0.5)/ _ScreenParams.x) * 2 -1)*imgAsp;
float ycord = 1-((i.pos.y + 0.5) / _ScreenParams.y) * 2 ;
float m00 = determinant(float3x3 (UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][2], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[2][1], UNITY_MATRIX_VP[2][2], UNITY_MATRIX_VP[2][3],
UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m01 = -determinant(float3x3 (UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][2], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[2][0], UNITY_MATRIX_VP[2][2], UNITY_MATRIX_VP[2][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m02 = determinant(float3x3 (UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[2][0], UNITY_MATRIX_VP[2][1], UNITY_MATRIX_VP[2][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][3]));
float m03 = -determinant(float3x3 (UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][2],
UNITY_MATRIX_VP[2][0], UNITY_MATRIX_VP[2][1], UNITY_MATRIX_VP[2][2],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2]));
float m10 = -determinant(float3x3 (UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][2], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[2][1], UNITY_MATRIX_VP[2][2], UNITY_MATRIX_VP[2][3],
UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m11 = determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][2], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[2][0], UNITY_MATRIX_VP[2][2], UNITY_MATRIX_VP[2][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m12 = -determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[2][0], UNITY_MATRIX_VP[2][1], UNITY_MATRIX_VP[2][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][3]));
float m13 = determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][2],
UNITY_MATRIX_VP[2][0], UNITY_MATRIX_VP[2][1], UNITY_MATRIX_VP[2][2],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2]));
float m20 = determinant(float3x3 (UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][2], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][2], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m21 = -determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][2], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][2], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m22 = determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][3]));
float m23 = -determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][2],
UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][2],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2]));
float m30 = -determinant(float3x3 (UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][2], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][2], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m31 = determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][2], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][2], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][2], UNITY_MATRIX_VP[3][3]));
float m32 = -determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][3],
UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][3],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][3]));
float m33 = determinant(float3x3 (UNITY_MATRIX_VP[0][0], UNITY_MATRIX_VP[0][1], UNITY_MATRIX_VP[0][2],
UNITY_MATRIX_VP[1][0], UNITY_MATRIX_VP[1][1], UNITY_MATRIX_VP[1][2],
UNITY_MATRIX_VP[3][0], UNITY_MATRIX_VP[3][1], UNITY_MATRIX_VP[3][2]));
float4x4 cov = float4x4(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33);
float4x4 invVP = float4x4 (0.4,0.2,-0.8,0.0,-0.4,0.9,0.0,0.0,0.8,0.3,0.4,0.0,5.4,3.0,-0.1,1.0);
float4 worldCord = mul(transpose(cov)/determinant(UNITY_MATRIX_VP), float4(xcord,ycord,-1.0,1.0));
return float4(worldCord.x, worldCord.y, 0.0, 1.0);
}
ENDCG
}
}
}
Your answer
Follow this Question
Related Questions
Updating world coordinate according to world points 1 Answer
Can I use the local x,y transforms of a plane? 1 Answer
How can I get Rigidbody.MoveRotation to rotate in world space on two axes? 1 Answer
heeelp!, i need to cast a ray from transform local position to "down" in local position 1 Answer
Raycast Hit and Raycast by layer 1 Answer