C# Unity Shaderlab-从屏幕空间到世界空间的转换

C# Unity Shaderlab-从屏幕空间到世界空间的转换,c#,matrix,unity3d,camera,shaderlab,C#,Matrix,Unity3d,Camera,Shaderlab,我正在制作一个需要世界空间坐标的后处理着色器(在unity中)。我可以访问某个像素的深度信息,以及该像素在屏幕上的位置。如何找到该像素对应的世界位置,就像函数ViewportToWorldPos()一样?看看本教程: 基本上: 在屏幕的每个角落存储一个向量,作为常量传递,从摄像机位置到所述角落 基于屏幕空间位置或屏幕空间四边形的UV插值向量 将最终位置计算为摄影机位置+插值向量*深度 已经三年了!我最近在做这个,一位老工程师帮我解决了这个问题。这是代码 我们需要首先为脚本中的着色器提供摄影机变

我正在制作一个需要世界空间坐标的后处理着色器(在unity中)。我可以访问某个像素的深度信息,以及该像素在屏幕上的位置。如何找到该像素对应的世界位置,就像函数ViewportToWorldPos()一样?

看看本教程:

基本上:

  • 在屏幕的每个角落存储一个向量,作为常量传递,从摄像机位置到所述角落

  • 基于屏幕空间位置或屏幕空间四边形的UV插值向量

  • 将最终位置计算为摄影机位置+插值向量*深度


    • 已经三年了!我最近在做这个,一位老工程师帮我解决了这个问题。这是代码

    • 我们需要首先为脚本中的着色器提供摄影机变换矩阵:

      void OnRenderImage(RenderTexture src、RenderTexture dst)
      {
      Camera CurrentCamera=Camera.main;
      Matrix4x4 matrixCameraToWorld=currentCamera.cameraToWorldMatrix;
      Matrix4x4 matrixProjectionInverse=GL.GetGPUProjectionMatrix(currentCamera.projectionMatrix,false)。反向;
      Matrix4x4 MatrixClipToWorld=matrixCameraToWorld*matrixProjectionInverse;
      SetGlobalMatrix(“_MatrixHClipToWorld”,MatrixHClipToWorld);
      图形。Blit(src、dst、材料);
      }
      
    • 然后我们需要深度信息来变换剪辑位置。如下所示:

      inline half3 TransformUVToWorldPos(half2 uv)
      {
      半深=tex2D(_CameraDepthTexture,uv).r;
      #ifndef着色器\u API\u GLCORE
      half4位置Cs=half4(uv*2-1,深度,1)*线性深度(深度);
      #否则
      half4位置Cs=half4(uv*2-1,深度*2-1,1)*线性深度(深度);
      #恩迪夫
      返回mul(_MatrixHClipToWorld,positionCS).xyz;
      }
      

    • 仅此而已。

      查看此处的“通过世界空间位置切片”示例(向下滚动):这与我想要的内容无关。我正在使用后期处理着色器。好的,试试这里:你知道搜索引擎,对吗?我知道搜索引擎。这篇文章对我没有什么帮助,因为我已经知道如何进行后期处理着色器。在这个具体问题上我需要帮助。