As you guys know, in Unity we can write shaders in some different ways. We can have Fixed Pipeline Shaders, Surface Shaders and CGPrograms (vertex and fragment shaders).
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!