ToonShadowed

From Unify Community Wiki
Jump to: navigation, search


Author: Jon Frisby

Description

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.

ShaderLab - ToonShadowed.shader

Invalid language.

You need to specify a language like this: <source lang="html4strict">...</source>

Supported languages for syntax highlighting:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, oobas, oracle11, oracle8, oxygene, oz, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, uscript, vala, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


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
Namespaces

Variants
Actions
Navigation
Extras
Tools