[UnityShader]地表遮罩实现

2020/09 04 14:09

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