Surface Shaders are great to write lightning models, but I always believed that it limit the shader to just one pass. Well, yesterday I discovered that I was WRONG. I found a very interesting topic in Unity forum about this and I started to play around with it.
Here follows a very simple shader that illustrate how is possible to combine those languages and have a multi pass shader. Just uncomment the pass blocks to see the effect.
Shader "ZGreaterTest" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _Indicator ("Indicator Color", Color) = (1,1,1,1) _Cutoff ("Alpha cutoff", Range (0,1)) = 0.0 } SubShader { Tags { "Queue" = "Geometry+1" "RenderType" = "Opaque" } CGPROGRAM #pragma surface surf BlinnPhong alphatest:_Cutoff uniform float4 _Color; uniform float4 _Indicator; uniform sampler2D _MainTex; struct Input { float2 uv_MainTex; float3 viewDir; }; void surf (Input IN, inout SurfaceOutput o) { o.Albedo = tex2D ( _MainTex, IN.uv_MainTex).rgb * _Color; } ENDCG // Pass: Surface SHADER // ZWrite Off // ZTest Greater // Blend DstColor Zero // // CGPROGRAM // #pragma surface surf BlinnPhong // uniform float4 _Color; // uniform float4 _Indicator; // uniform sampler2D _MainTex; // // struct Input // { // float2 uv_MainTex; // float3 viewDir; // }; // // void surf (Input IN, inout SurfaceOutput o) // { // //o.Albedo =_Indicator; // o.Albedo = tex2D ( _MainTex, IN.uv_MainTex).rgb * _Indicator; // } // ENDCG // Pass: CG SHADER // Pass // { // Tags { "LightMode" = "Always" } // AlphaTest Greater [_Cutoff] // ZWrite Off // ZTest Greater // // CGPROGRAM // #pragma vertex vert // #pragma fragment frag // #pragma fragmentoption ARB_precision_hint_fastest // #include "UnityCG.cginc" // // sampler2D _MainTex; // float4 _MainTex_ST; // uniform float4 _Indicator; // // struct v2f // { // float4 pos : POSITION; // float2 uv : TEXCOORD1; // }; // // v2f vert (appdata_full v) // { // v2f o; // o.pos = mul(UNITY_MATRIX_MVP, v.vertex); // o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); // return o; // } // // half4 frag( v2f i ) : COLOR // { // half4 texcol = tex2D (_MainTex, i.uv); // return texcol * _Indicator; // } // ENDCG // } // Pass: Fixed pipeline // Pass // { // Tags { "LightMode" = "Always" } // AlphaTest Greater [_Cutoff] // ZWrite Off // ZTest Greater // // SetTexture [_MainTex] // { // constantColor [_Indicator] // //combine constant, texture // combine constant* texture // } // } } Fallback " Glossy", 0 }I would like to thank Sycle and Farfarer to share this tip. :)
I think that the next post will be about a voxelizer that I'm writing. Stay tuned!
Great job Charleira, I will stay tune.
ReplyDelete