From Unify Community Wiki
Revision as of 13:51, 4 March 2008 by MrJoy (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

This shader behaves precisely like the Toon-Basic shader with two exceptions: 1) If a pixel light casts upon it, then it can receive shadows. 2) It has proper culling, making it unsuitable for use with the Outline toon shader variant unless you add "Cull Off" to both Pass blocks below.

None of the actual *light* is used -- it ONLY receives shadows. Shadows fall as they normally would -- they are not skewed to orient following the cubemap. It must be a pixel light, because only pixel lights can cast shadows.

Thanks to Aras for his super-prompt response that saved me from embarrassing myself with a stupid vertex fragment that was naive and 3 instructions longer.

Shader "MrJoy/Toon/Shadowed" { Properties { _Color ("Main Color", Color) = (.5,.5,.5,1) _MainTex ("Base (RGB)", 2D) = "white" {} _ToonShade ("ToonShader Cubemap(RGB)", CUBE) = "white" { Texgen CubeNormal } }

Category { SubShader { Pass { // Fallback case for non-pixel-lit situations. Blend Off Name "BASE" Tags {"LightMode" = "VertexOrNone"} SetTexture [_MainTex] { constantColor [_Color] Combine texture * constant } SetTexture [_ToonShade] { combine texture * previous DOUBLE, previous } } Pass { Blend Off Name "PPL" Tags { "LightMode" = "Pixel" } ColorMask RGBA CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_builtin #pragma fragmentoption ARB_fog_exp2 #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" #include "AutoLight.cginc"

struct v2f { V2F_POS_FOG; LIGHTING_COORDS float2 uvA; float3 uvB; };

uniform float4 _MainTex_ST;

v2f vert (appdata_tan v) { v2f o; PositionFog( v.vertex, o.pos, o.fog ); o.uvA = TRANSFORM_TEX(v.texcoord, _MainTex); o.uvB = mul((float3x3)glstate.matrix.invtrans.modelview[0], v.normal ); TRANSFER_VERTEX_TO_FRAGMENT(o); return o; }

uniform sampler2D _MainTex; uniform samplerCUBE _ToonShade; uniform float4 _Color;

float4 frag (v2f i) : COLOR { half4 texcol = tex2D( _MainTex, i.uvA ) * _Color; half4 lighting = LIGHT_ATTENUATION(i) * texCUBE(_ToonShade, i.uvB);

return half4((texcol * lighting * 2).rgb, texcol.a); } ENDCG } } } Fallback "VertexLit" }

Personal tools