C# Unity Shaderlab-从屏幕空间到世界空间的转换
我正在制作一个需要世界空间坐标的后处理着色器(在unity中)。我可以访问某个像素的深度信息,以及该像素在屏幕上的位置。如何找到该像素对应的世界位置,就像函数ViewportToWorldPos()一样?看看本教程: 基本上:C# Unity Shaderlab-从屏幕空间到世界空间的转换,c#,matrix,unity3d,camera,shaderlab,C#,Matrix,Unity3d,Camera,Shaderlab,我正在制作一个需要世界空间坐标的后处理着色器(在unity中)。我可以访问某个像素的深度信息,以及该像素在屏幕上的位置。如何找到该像素对应的世界位置,就像函数ViewportToWorldPos()一样?看看本教程: 基本上: 在屏幕的每个角落存储一个向量,作为常量传递,从摄像机位置到所述角落 基于屏幕空间位置或屏幕空间四边形的UV插值向量 将最终位置计算为摄影机位置+插值向量*深度 已经三年了!我最近在做这个,一位老工程师帮我解决了这个问题。这是代码 我们需要首先为脚本中的着色器提供摄影机变
- 在屏幕的每个角落存储一个向量,作为常量传递,从摄像机位置到所述角落
- 基于屏幕空间位置或屏幕空间四边形的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; }
- 已经三年了!我最近在做这个,一位老工程师帮我解决了这个问题。这是代码
仅此而已。查看此处的“通过世界空间位置切片”示例(向下滚动):这与我想要的内容无关。我正在使用后期处理着色器。好的,试试这里:你知道搜索引擎,对吗?我知道搜索引擎。这篇文章对我没有什么帮助,因为我已经知道如何进行后期处理着色器。在这个具体问题上我需要帮助。