Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
12 Jun 22 - 14 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by mircbone · Nov 03, 2016 at 12:49 PM · raycastworld spaceworld coordinates

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
     }
    }

}

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

3 People are following this question.

avatar image avatar image avatar image

Related Questions

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

Updating world coordinate according to world points 1 Answer

heeelp!, i need to cast a ray from transform local position to "down" in local position 1 Answer

onGround raycasts return onGround is true while colliding with platform sides 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges