[UnityShader]地表遮罩实现
R0:拍摄RT的左下角(小值)
R1:拍摄RT的右上角(大值)
C:当前摄像机注视地图的中心点
P:摄像机口内任意一点
所以,P的UV等于
(P-R0)/(R1-R0)
一、构建正交摄像机
camera.transform.position.xz = (R1-R0)/2;
camera.transform.position.y = 100;
camera.orthographic=true;
camera.aspect = (R1.x-R0.x)/(R1.y-R0.y);
camera.farClipPlane = 200;
camera.transform.localRotation = Quaternion.Euler(90,0,0);
camera.clearFlags = CameraClearFlags.Color;
camera.backgroundColor = Color.clear;
camera.cullingMask = XXXX;
在需要更新的地方,进行camera.Render();
二、向Shader中传递R0和R1的信息
Shader.SetGlobalVector(“Offset”, new Vector4(R0.x, R0.y, R1.x-R0.x, R1.y-R0.y);
三、在Shader中使用世界坐标采样
half uv_x = ( wpos.x – Offset.x ) / Offset .z;
half uv_y = ( wpos.z – Offset .y ) / Offset .w;
fixed4 maskColor = tex2D(MaskTes, half2(uv_x, uv_y));
三、遮罩图,使用1+1的混合模式
Blend One One,这样可以让多层RGB通道正常叠加混合
四、优化
当摄像机在一屏内移动时,可以不用重复拍摄此RT
Post Link: [UnityShader]地表遮罩实现