TerrainFourLayer2Pass

From Unify Community Wiki
Jump to: navigation, search

Author: Eric Haines (Eric5h5) - Based on the TerrainFourLayer shader

Description

This is similar to the above referenced shader, with these differences: 1) It should work properly on all graphics cards from the 5200FX and later 2) It has fog 3) It uses 2 passes, so it's slower 4) It has a _Base texture, which is used as a fallback for really old cards like the Radeon 8500 and older. This should be like the mixing mask, but with colors, so you can at least get a flat-shaded version of the texture colors...otherwise you'd just get a single texture which wouldn't be representative of the mixed texture at all. If you don't care about old cards like that, then you can skip it.

Usage

Place this shader somewhere in your Assets folder hierarchy, create a material which uses it and apply it to the relevant objects.

ShaderLab - FourLayerVertexLit2Pass.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 "Terrain/Four Layer VertexLit 2Pass" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Color 1 (RGB)", 2D) = "white" {}
    _MainTex2 ("Color 2 (RGB)", 2D) = "white" {}
    _MainTex3 ("Color 3 (RGB)", 2D) = "white" {}
    _MainTex4 ("Color 4 (RGB)", 2D) = "white" {}
    _Mask ("Mixing Mask (RGBA)", 2D) = "gray" {}
    _Base ("Base Color (RGB)", 2D) = "white" {}
}
Category {
    Lighting On
    Cull Back
    Fog { Color [_AddFog] }
    Subshader {
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        
        Pass {
CGPROGRAM
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"
 
sampler2D _MainTex;
sampler2D _MainTex2;
sampler2D _MainTex3;
sampler2D _Mask;
 
struct v2f {
    V2F_POS_FOG;
    float4 uv[4] : TEXCOORD0;
    float4 diffuse : COLOR;
};
 
half4 frag( v2f i ) : COLOR
{
    // get the first three layer colors
    half4 color1 = tex2D( _MainTex, i.uv[0].xy );
    half4 color2 = tex2D( _MainTex2, i.uv[1].xy );
    half4 color3 = tex2D( _MainTex3, i.uv[2].xy );
    // get the mixing mask texture
    half4 mask = tex2D( _Mask, i.uv[3].xy );
    // mix the three layers
    half4 color = color1 * mask.r + color2 * mask.g + color3 * mask.b;
    // multiply and double by the lighting
    return color * i.diffuse * 2.0;
}
ENDCG
        }
        
        Pass {
            Blend One One
CGPROGRAM
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"
 
sampler2D _MainTex4;
sampler2D _Mask;
 
struct v2f {
    V2F_POS_FOG;
    float4 uv[2] : TEXCOORD0;
    float4 diffuse : COLOR;
};
 
half4 frag( v2f i ) : COLOR
{
    // Finish the last texture mix in the second pass...some cards don't have enough registers to do it in one pass
    half4 color1 = tex2D( _MainTex4, i.uv[0].xy );
    half4 mask = tex2D( _Mask, i.uv[1].xy );
    half4 color = color1 * mask.a;
    return color * i.diffuse * 2.0;
}
ENDCG        
        }
    }
} 
    // ------------------------------------------------------------------
    // Radeon 7000 / 9000
    
    SubShader {
        Pass {
            Material {
                Diffuse [_Color]
                Ambient [_Color]
            } 
            Lighting On
            SetTexture [_Base] {
                Combine texture * primary DOUBLE, texture * primary
            }
        }
    }
}
Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Tools