Unity 战争迷雾shader

首先创建两个摄像机,两个摄像机的所有值都一样,把一个拖成子物体。接着 ,在地形的下方创建一个跟地形差不多长、宽的plane,给他一个材质球,材质球设为黑色。

接着,创建一个WarFog层,将子摄像机的渲染层Culling Mask设置成只渲染WarFog层。将Plane设置成WarFog层。

在角色底下创建一个白色面板,设置为WarFog层。创建一个Render Texture ,将它拖到子摄像机的Target Texture属性上。

将主摄像机的Culling Mask去除WarFog层,加上如下脚本。

[csharp]  view plain  copy
  1. "code" class="csharp">using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Warfog : MonoBehaviour {  
  5.   
  6.     [SerializeField]  
  7.     //拖到子摄像机上的Render Texture  
  8.     private RenderTexture mask;  
  9.   
  10.     [SerializeField]  
  11.     //创建的材质球   需要用到WarFog sharder  在下面给出  
  12.     private Material mat;  
  13.     //在图像渲染之后执行  
  14.     public void OnRenderImage(RenderTexture source,RenderTexture des)  
  15.     {  
  16.         //将遮罩的mask传入材质球  
  17.         mat.SetTexture("_MaskTex",mask);  
  18.         //经过材质球的sharder变换后  拷贝源纹理到目的渲染纹理。  
  19.         Graphics.Blit(source,des,mat);  
  20.     }  
  21. }  

 
  

创建材质球MaskMat将sharder换成如下sharder

[plain]  view plain  copy
  1. Shader "Custom/WarFog" {    
  2.     Properties {    
  3.         _MainTex ("_MainTex", 2D) = "white" {}    
  4.         //遮罩纹理     
  5.         _MaskTex ("_MaskTex", 2D) = "white" {}  
  6.     }    
  7.     SubShader {    
  8.         Pass {    
  9.             CGPROGRAM    
  10.             //顶点处理器  
  11.             #pragma vertex m_vert_img    
  12.             //片段处理器  
  13.             #pragma fragment frag    
  14.                  
  15.             #include "UnityCG.cginc"    
  16.                  
  17.             uniform sampler2D _MainTex;    
  18.             uniform sampler2D _MaskTex;   
  19.                  
  20.                struct m_appdata_img {  
  21.                 float4 vertex : POSITION;  
  22.                 half2 texcoord : TEXCOORD0;  
  23.                 half2 texcoord1 : TEXCOORD1;  
  24.                 };  
  25.                 struct m_v2f_img {  
  26.                 float4 pos : SV_POSITION;  
  27.                 half2 uv : TEXCOORD0;  
  28.                 half2 uv1 : TEXCOORD1;  
  29.                 };  
  30.             //像素处理器  
  31.             fixed4 frag(m_v2f_img i) : COLOR    
  32.             {    
  33.                 //主纹理  
  34.                 fixed4 renderTex = tex2D(_MainTex, i.uv);  
  35.                 //遮罩纹理  
  36.                 fixed4 renderTex1 = tex2D(_MaskTex, i.uv1);   
  37.                 fixed4 finalColor;  
  38.                 //如果遮罩的红色通道小于0.3  最终颜色就是遮罩图片   否则为主图片  
  39.                 if(renderTex1.r<.3){  
  40.                     finalColor = renderTex1.rgba;  
  41.                 }else{  
  42.                     finalColor = renderTex.rgba;  
  43.                 }   
  44.                      
  45.                 return finalColor;    
  46.             }    
  47.     //调整UV值   实现正常偏转  
  48.     float2 m_MultiplyUV (float4x4 mat, float2 inUV) {  
  49.     float4 temp = float4 (inUV.x, 1-inUV.y, 0, 0);  
  50.     temp = mul (mat, temp);  
  51.     return temp.xy;  
  52.     }  
  53.   
  54.   
  55. m_v2f_img m_vert_img( m_appdata_img v )  
  56. {  
  57.     m_v2f_img o;  
  58.     o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  
  59.     o.uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord );  
  60.     o.uv1 = m_MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord1 );  
  61.     return o;  
  62. }  
  63.             ENDCG    
  64.         }    
  65.     }    
  66.     FallBack "Diffuse"    
  67. }  

你可能感兴趣的:(Unity)