天天看點

shader程式設計學習(2)遮擋顯示

前言

通過學習一個個案例,來學習shader程式設計,我認為是最有效和快速的方法,尤其對于shader程式設計來說,知識點相當繁雜,作為初學者的我,很容易摸不清頭腦,

學習例子,能幫助學習渲染過程,同時積累知識點,當做的例子多了,自然而然,積累的知識點能連成了線,變成了網,自身的水準肯定得到了提升

今天學習 遮擋物的顯示,原部落格傳送門:http://blog.csdn.net/u011047171/article/details/46562969

上圖

shader程式設計學習(2)遮擋顯示

代碼

Shader "ZX/OccTransVF" 
//遮擋顯示    
//分析:渲染是按照pass的順序來進行,把遮擋顯示放在第一位,正常顯示放在第二位
//渲染按照 Queue的先後順序進行,當判斷當物體配前面擋住了,pass1執行,顯示紋理,pass2不執行
//當沒有擋住時,pass1,pass2順序執行,pass2的紋理覆寫到pass1

{    
    Properties     
    {     
        _MainTex ("Base (RGB)", 2D) = "white" {}    
        _RimColor("RimColor",Color) = (0,1,1,1)  
        _RimPower ("Rim Power", Range(0.1,8.0)) = 1.0  
    }    
        
    SubShader     
    {    
          
        LOD 300    
		//物體要在建築之後渲染
        Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }   
        Pass  
        {  
			//要混合 建築物和遮擋物體的顔色
            Blend SrcAlpha One  
			//不要記錄像素的深度值
            ZWrite off  
            Lighting off  
			//渲染隊列走到了渲染該物體的時候,深度>之前渲染的物體深度最小值時,即在物體後面,執行渲染
            ztest greater  
  
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            #include "UnityCG.cginc"  
  
            float4 _RimColor;  
            float _RimPower;  
              
            struct appdata_t {  
                float4 vertex : POSITION;  
                float2 texcoord : TEXCOORD0;  
                float4 color:COLOR;  
                float4 normal:NORMAL;  
            };  
  
            struct v2f {  
                float4  pos : SV_POSITION;  
                float4  color:COLOR;  
            } ;  
            v2f vert (appdata_t v)  
            {  
                v2f o;  
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);  
				//ObjSpaceViewDir 傳回點到視點的一個向量
                float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));  
				//saturate函數将 點積固定在0-1的範圍,越接近0,說明點越靠近邊緣,rim越接近1
                float rim = 1 - saturate(dot(viewDir,v.normal ));  
				//遮罩的顔色 *rim的_RimPower次方 讓顔色變化曲線更陡峭
                o.color = _RimColor*pow(rim,_RimPower);  
                return o;  
            }  
            float4 frag (v2f i) : COLOR  
            {  
                return i.color;   
            }  
            ENDCG  
        }  
		//正常的渲染
        pass    
        {    
            ZWrite on  
            ZTest less   
  
            CGPROGRAM    
            #pragma vertex vert    
            #pragma fragment frag    
            sampler2D _MainTex;    
            float4 _MainTex_ST;  
                
            struct appdata {    
                float4 vertex : POSITION;    
                float2 texcoord : TEXCOORD0;    
            };    
              
            struct v2f  {    
                float4 pos : POSITION;    
                float2 uv : TEXCOORD0;    
            };    
              
            v2f vert (appdata v)   
            {    
                v2f o;    
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);    
                o.uv = v.texcoord;    
                return o;    
            }   
               
            float4 frag (v2f i) : COLOR    
            {    
                float4 texCol = tex2D(_MainTex, i.uv);    
                return texCol;    
            }    
            ENDCG    
        }    
    }   
    FallBack "Diffuse"   
}    
           

總結

遮擋pass 後期可以和更多的shader組合,期待。。。。

繼續閱讀