TerrainTwoLayerBumped
m (Text replace - "<shaderlab>" to "<syntaxhighlight lang="shaderlab">") |
m (Text replace - "</shaderlab>" to "</syntaxhighlight>") |
||
Line 144: | Line 144: | ||
FallBack "VertexLit" | FallBack "VertexLit" | ||
− | }</ | + | }</syntaxhighlight> |
==ShaderLab - TerrainTwoLayerBumped.shader for Unity 1.x== | ==ShaderLab - TerrainTwoLayerBumped.shader for Unity 1.x== | ||
Line 282: | Line 282: | ||
FallBack " VertexLit", 1 | FallBack " VertexLit", 1 | ||
− | }</ | + | }</syntaxhighlight> |
Latest revision as of 21:56, 17 January 2012
Author: Aras Pranckevicius
Contents |
[edit] Description
This shader is similar to LayerShader - it mixes two tileable textures based on the third texture, and adds bumpmapping on top. In Unity 2.x it supports shadows as well.
This shader requires a fragment program card for bumpmapping to work. Where bumpmapping is not supported, it fallbacks to a vertex lit version, which is the same as LayerShader (and this requires a 4-texture card - GeForce3 and up, Radeon 8500 and up).
Note that bumpmapping version in Unity 1.x does not work on GeForceFX, even if otherwise these cards support fragment programs (shader requires more than 4 texture units per pass). In Unity 2.x it should work on GeForceFX as well.
[edit] Usage
A typical setup is displayed: two tileable textures, an alpha texture to control the blending between them, and a bump map.
[edit] ShaderLab - TerrainTwoLayerBumped.shader for Unity 2.x
This version is for Unity 2.x only!
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 "Terrain/TwoLayer Bumped" { Properties { _Color ("Main Color", Color) = (1,1,1,0.5) _MainTex ("Base (RGB)", 2D) = "white" {} _MainTex2 ("Base 2 (RGB)", 2D) = "white" {} _Mask ("Mix Mask (A)", 2D) = "gray" {} _BumpMap ("Bumpmap (RGB)", 2D) = "bump" {} } Category { Blend AppSrcAdd AppDstAdd Fog { Color [_AddFog] } // ------------------------------------------------------------------ // ARB fragment program SubShader { // Ambient pass Pass { Tags {"LightMode" = "PixelOrNone"} Color [_PPLAmbient] SetTexture [_MainTex] { combine texture } SetTexture [_Mask] { combine previous, texture } SetTexture [_MainTex2] { combine texture lerp (previous) previous } SetTexture [_MainTex2] { constantColor [_Color] combine previous * primary DOUBLE, previous * constant } } // Vertex lights Pass { Tags {"LightMode" = "Vertex"} Lighting On Material { Diffuse [_Color] Emission [_PPLAmbient] } SetTexture [_MainTex] { combine texture } SetTexture [_Mask] { combine previous, texture } SetTexture [_MainTex2] { combine texture lerp (previous) previous } SetTexture [_MainTex2] { constantColor [_Color] combine previous * primary DOUBLE, previous * constant } } // Pixel lights Pass { Name "PPL" Tags { "LightMode" = "Pixel" } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_fog_exp2 #pragma fragmentoption ARB_precision_hint_fastest #pragma multi_compile_builtin #include "UnityCG.cginc" #include "AutoLight.cginc" struct v2f { V2F_POS_FOG; LIGHTING_COORDS float2 uv[4]; float3 lightDirT; }; float4 _MainTex_ST, _MainTex2_ST, _Mask_ST, _BumpMap_ST; v2f vert (appdata_tan v) { v2f o; PositionFog( v.vertex, o.pos, o.fog ); o.uv[0] = TRANSFORM_TEX(v.texcoord, _MainTex); o.uv[1] = TRANSFORM_TEX(v.texcoord, _MainTex2); o.uv[2] = TRANSFORM_TEX(v.texcoord, _Mask); o.uv[3] = TRANSFORM_TEX(v.texcoord, _BumpMap); TANGENT_SPACE_ROTATION; o.lightDirT = mul( rotation, ObjSpaceLightDir( v.vertex ) ); TRANSFER_VERTEX_TO_FRAGMENT(o); return o; } uniform sampler2D _MainTex; uniform sampler2D _MainTex2; uniform sampler2D _Mask; uniform sampler2D _BumpMap; float4 frag (v2f i) : COLOR { half4 col1 = tex2D(_MainTex,i.uv[0]); half4 col2 = tex2D(_MainTex2,i.uv[1]); half mix = tex2D(_Mask,i.uv[2]).a; half4 texcol = lerp(col1,col2,mix); // get normal from the normal map float3 normal = tex2D(_BumpMap, i.uv[3]).xyz * 2 - 1; return DiffuseLight( i.lightDirT, normal, texcol, LIGHT_ATTENUATION(i) ); } ENDCG } } // ------------------------------------------------------------------ // Four texture cards SubShader { // Vertex lit Pass { Lighting On Material { Diffuse [_Color] Ambient [_Color] } SetTexture [_MainTex] { combine texture } SetTexture [_Mask] { combine previous, texture } SetTexture [_MainTex2] { combine texture lerp (previous) previous } SetTexture [_MainTex2] { constantColor [_Color] combine previous * primary DOUBLE, previous * constant } } } } FallBack "VertexLit" }
[edit] ShaderLab - TerrainTwoLayerBumped.shader for Unity 1.x
This version is for Unity 1.x only!
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 "Terrain/TwoLayer Bumped" { Properties { _Color ("Main Color", Color) = (1,1,1,0.5) _MainTex ("Base (RGB)", 2D) = "white" {} _MainTex2 ("Base 2 (RGB)", 2D) = "white" {} _Mask ("Mix Mask (A)", 2D) = "gray" {} _BumpMap ("Bumpmap (RGB)", 2D) = "bump" {} } Category { Blend AppSrcAdd AppDstAdd Fog { Color [_AddFog] } // ------------------------------------------------------------------ // ARB fragment program SubShader { // Ambient pass Pass { Tags {"LightMode" = "PixelOrNone"} Color [_PPLAmbient] SetTexture [_MainTex] { combine texture } SetTexture [_Mask] { combine previous, texture } SetTexture [_MainTex2] { combine texture lerp (previous) previous } SetTexture [_MainTex2] { constantColor [_Color] combine previous * primary DOUBLE, previous * constant } } // Vertex lights Pass { Tags {"LightMode" = "Vertex"} Lighting On Material { Diffuse [_Color] Emission [_PPLAmbient] } SetTexture [_MainTex] { combine texture } SetTexture [_Mask] { combine previous, texture } SetTexture [_MainTex2] { combine texture lerp (previous) previous } SetTexture [_MainTex2] { constantColor [_Color] combine previous * primary DOUBLE, previous * constant } } // Pixel lights Pass { Name "PPL" Tags { "LightMode" = "Pixel" } CGPROGRAM // profiles arbfp1 // fragment frag // fragmentoption ARB_fog_exp2 // fragmentoption ARB_precision_hint_fastest // vertex vert // autolight 7 #include "UnityCG.cginc" #include "AutoLight.cginc" struct v2f { V2F_POS_FOG; float2 uv[4] : TEXCOORD0; float3 lightDirT : TEXCOORD4; V2F_LIGHT_COORDS(TEXCOORD5); }; struct v2f2 { V2F_POS_FOG; float2 uv[4] : TEXCOORD0; float3 lightDirT : TEXCOORD4; }; Light l; v2f vert (appdata_tan v) { v2f o; PositionFog( v.vertex, o.pos, o.fog ); o.uv[0] = TRANSFORM_UV(0); o.uv[1] = TRANSFORM_UV(1); o.uv[2] = TRANSFORM_UV(2); o.uv[3] = TRANSFORM_UV(3); TANGENT_SPACE_ROTATION; o.lightDirT = mul( rotation, ObjSpaceLightDir( v.vertex ) ); PASS_LIGHT_COORDS(4); return o; } uniform sampler2D _MainTex : register(s0); uniform sampler2D _MainTex2 : register(s1); uniform sampler2D _Mask : register(s2); uniform sampler2D _BumpMap : register(s3); float4 frag (v2f2 i, LIGHTDECL(TEXUNIT4)) : COLOR { half4 col1 = tex2D(_MainTex,i.uv[0]); half4 col2 = tex2D(_MainTex2,i.uv[1]); half mix = tex2D(_Mask,i.uv[2]).a; half4 texcol = lerp(col1,col2,mix); // get normal from the normal map float3 normal = tex2D(_BumpMap, i.uv[3]).xyz * 2 - 1; return DiffuseLight( i.lightDirT, normal, texcol, LIGHTATT ); } ENDCG SetTexture [_MainTex] {} SetTexture [_MainTex2] {} SetTexture [_Mask] {} SetTexture [_BumpMap] {} SetTexture [_LightTexture0] {} SetTexture [_LightTextureB0] {} } } // ------------------------------------------------------------------ // Four texture cards SubShader { // Vertex lit Pass { Lighting On Material { Diffuse [_Color] Ambient [_Color] } SetTexture [_MainTex] { combine texture } SetTexture [_Mask] { combine previous, texture } SetTexture [_MainTex2] { combine texture lerp (previous) previous } SetTexture [_MainTex2] { constantColor [_Color] combine previous * primary DOUBLE, previous * constant } } } } FallBack " VertexLit", 1 }