天天看点

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组合,期待。。。。

继续阅读