- 在顶点着色器中使用 ComputeScreenPos.
- 使用 tex2Dproj 搭配 screenPos 来按屏幕 uv 采样 屏幕材质(如 _CameraDepthTexture 和 _CameraNormalTexture).
- ComputeScreenPos:
-
- 接受的输入 顶点在裁剪空间(经过 MVP matrix 的变换) 的位置
- 将输出 从
--- 转自 ComputeScreenPos解析-CSDN博客
今天学习Unity Shader做水特效时,看到两个函数ComputeScreenPos、tex2Dproj,相关代码如下:
…… i.proj = ComputeScreenPos(UnityObjectToClipPos(v.vertex)); …… half depth = LinearEyeDepth(tex2Dproj(_CameraDepthTexture, i.proj).r); ……
注意到ComputeScreenPos得到的结果用在了 tex2Dproj 函数中作为uv参数。看函数名ComputeScreenPos应该是计算屏幕坐标,得到的应该是具体的坐标值,不应该是uv值。遂查询该方法,定义如下:
inline float4 ComputeNonStereoScreenPos(float4 pos) { float4 o = pos * 0.5f;
// =(0.5x, 0.5y, 0.5z, 0.5w) o.xy = float2(o.x, o.y*_ProjectionParams.x) + o.w;
// =(0.5x + 0.5w, 0.5y * _Proj.x + 0.5w, 0.5z, 0.5w) o.zw = pos.zw;
// =(0.5x + 0.5w, 0.5y * _Porj.x + 0.5w, z, w) return o; } inline float4 ComputeScreenPos(float4 pos) { float4 o = ComputeNonStereoScreenPos(pos); #if defined(UNITY_SINGLE_PASS_STEREO) o.xy = TransformStereoScreenSpaceTex(o.xy, pos.w); #endif return o; }
发现ComputeScreenPos的结果确实不是屏幕坐标,而是把裁剪空间坐标从 [-w,w] 转成 [0,w]。 tex2Dproj 在采样的时候会除以w分量。
我们需要在顶点着色器中使用ComputeScreenPos得到结果,在片元着色器中除以其次分量得到视口空间坐标,具体原因见《UnityShader入门精要》 4.93章节(92页)
标签:tex2Dproj,ComputeScreenPos,0.5,pos,Shader,使用,float4 From: https://www.cnblogs.com/bakabird/p/18301577