Silhouette-Outlined Diffuse

From Unify Community Wiki
(Difference between revisions)
Jump to: navigation, search
Line 7: Line 7:
 
[[Image:SilhouetteOutline1.jpg|thumb|Notice the left foot is far too down the ground.]]
 
[[Image:SilhouetteOutline1.jpg|thumb|Notice the left foot is far too down the ground.]]
  
[[Image:SilhouetteOutline2.jpg|thumb|The outline is merely the object in question but scaled upwards, rendered in a single color, and it always shows on top of everything (like the tree here), except the object it is outlining.]]
+
[[Image:SilhouetteOutline2.jpg|thumb|The outline is merely the object in question but scaled upwards, rendered in a single color, and it always shows on top of everything (like the tree here), except the object it is outlining. You can remove the "showing on top" effect by removing all occurrences of "ZTest Always"]]
  
 
<shaderlab>
 
<shaderlab>
Line 104: Line 104:
 
Tags { "LightMode" = "Always" }
 
Tags { "LightMode" = "Always" }
 
Cull Front
 
Cull Front
ZWrite On
+
ZWrite Off
 +
ZTest Always
 
ColorMask RGB
 
ColorMask RGB
  
Line 241: Line 242:
 
Tags { "LightMode" = "Always" }
 
Tags { "LightMode" = "Always" }
 
Cull Front
 
Cull Front
ZWrite On
+
ZWrite Off
 +
ZTest Always
 
Offset 15,15
 
Offset 15,15
  

Revision as of 02:50, 13 July 2011

Author: User:AnomalousUnderdog.

Description

A variant of Outlined Diffuse 3 showing outlines only at the exteriors of the object. Useful for showing which character is selected in a strategy game, for example.

Notice the left foot is far too down the ground.
The outline is merely the object in question but scaled upwards, rendered in a single color, and it always shows on top of everything (like the tree here), except the object it is outlining. You can remove the "showing on top" effect by removing all occurrences of "ZTest Always"

<shaderlab> Shader "Outlined/Silhouetted Diffuse" { Properties { _Color ("Main Color", Color) = (.5,.5,.5,1) _OutlineColor ("Outline Color", Color) = (0,0,0,1) _Outline ("Outline width", Range (0.0, 0.03)) = .005 _MainTex ("Base (RGB)", 2D) = "white" { } }

CGINCLUDE

  1. include "UnityCG.cginc"

struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; };

struct v2f { float4 pos : POSITION; float4 color : COLOR; };

uniform float _Outline; uniform float4 _OutlineColor;

v2f vert(appdata v) { // just make a copy of incoming vertex data but scaled according to normal direction v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); float2 offset = TransformViewToProjection(norm.xy);

o.pos.xy += offset * o.pos.z * _Outline; o.color = _OutlineColor; return o; } ENDCG

SubShader { Tags { "Queue" = "Transparent" }

// note that a vertex shader is specified here but its using the one above Pass { Name "OUTLINE" Tags { "LightMode" = "Always" } Cull Off ZWrite Off ZTest Always ColorMask RGB // alpha not used

// you can choose what kind of blending mode you want for the outline Blend SrcAlpha OneMinusSrcAlpha // Normal //Blend One One // Additive //Blend One OneMinusDstColor // Soft Additive //Blend DstColor Zero // Multiplicative //Blend DstColor SrcColor // 2x Multiplicative

CGPROGRAM

  1. pragma vertex vert
  2. pragma fragment frag

half4 frag(v2f i) :COLOR { return i.color; } ENDCG }

Pass { Name "BASE" ZWrite On ZTest LEqual Blend SrcAlpha OneMinusSrcAlpha Material { Diffuse [_Color] Ambient [_Color] } Lighting On SetTexture [_MainTex] { ConstantColor [_Color] Combine texture * constant } SetTexture [_MainTex] { Combine previous * primary DOUBLE } } }

SubShader { Tags { "Queue" = "Transparent" }

Pass { Name "OUTLINE" Tags { "LightMode" = "Always" } Cull Front ZWrite Off ZTest Always ColorMask RGB

// you can choose what kind of blending mode you want for the outline Blend SrcAlpha OneMinusSrcAlpha // Normal //Blend One One // Additive //Blend One OneMinusDstColor // Soft Additive //Blend DstColor Zero // Multiplicative //Blend DstColor SrcColor // 2x Multiplicative

CGPROGRAM #pragma vertex vert #pragma exclude_renderers gles xbox360 ps3 ENDCG SetTexture [_MainTex] { combine primary } }

Pass { Name "BASE" ZWrite On ZTest LEqual Blend SrcAlpha OneMinusSrcAlpha Material { Diffuse [_Color] Ambient [_Color] } Lighting On SetTexture [_MainTex] { ConstantColor [_Color] Combine texture * constant } SetTexture [_MainTex] { Combine previous * primary DOUBLE } } }

Fallback "Diffuse" } </shaderlab>


Bumped version: <shaderlab> Shader "Outlined/Silhouetted Bumped Diffuse" { Properties { _Color ("Main Color", Color) = (.5,.5,.5,1) _OutlineColor ("Outline Color", Color) = (0,0,0,1) _Outline ("Outline width", Range (0.0, 0.03)) = .005 _MainTex ("Base (RGB)", 2D) = "white" { } _BumpMap ("Bumpmap", 2D) = "bump" {} }

CGINCLUDE

  1. include "UnityCG.cginc"

struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; };

struct v2f { float4 pos : POSITION; float4 color : COLOR; };

uniform float _Outline; uniform float4 _OutlineColor;

v2f vert(appdata v) { // just make a copy of incoming vertex data but scaled according to normal direction v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); float2 offset = TransformViewToProjection(norm.xy);

o.pos.xy += offset * o.pos.z * _Outline; o.color = _OutlineColor; return o; } ENDCG

SubShader { Tags { "Queue" = "Transparent" }

// note that a vertex shader is specified here but its using the one above Pass { Name "OUTLINE" Tags { "LightMode" = "Always" } Cull Off ZWrite Off ZTest Always

// you can choose what kind of blending mode you want for the outline Blend SrcAlpha OneMinusSrcAlpha // Normal //Blend One One // Additive //Blend One OneMinusDstColor // Soft Additive //Blend DstColor Zero // Multiplicative //Blend DstColor SrcColor // 2x Multiplicative

CGPROGRAM

  1. pragma vertex vert
  2. pragma fragment frag

half4 frag(v2f i) : COLOR { return i.color; } ENDCG }


CGPROGRAM

  1. pragma surface surf Lambert

struct Input { float2 uv_MainTex; float2 uv_BumpMap; }; sampler2D _MainTex; sampler2D _BumpMap; uniform float3 _Color; void surf(Input IN, inout SurfaceOutput o) { o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); } ENDCG

}

SubShader { Tags { "Queue" = "Transparent" }

Pass { Name "OUTLINE" Tags { "LightMode" = "Always" } Cull Front ZWrite Off ZTest Always Offset 15,15

// you can choose what kind of blending mode you want for the outline Blend SrcAlpha OneMinusSrcAlpha // Normal //Blend One One // Additive //Blend One OneMinusDstColor // Soft Additive //Blend DstColor Zero // Multiplicative //Blend DstColor SrcColor // 2x Multiplicative

CGPROGRAM #pragma vertex vert #pragma exclude_renderers gles xbox360 ps3 ENDCG SetTexture [_MainTex] { combine primary } }

CGPROGRAM

  1. pragma surface surf Lambert

struct Input { float2 uv_MainTex; float2 uv_BumpMap; }; sampler2D _MainTex; sampler2D _BumpMap; uniform float3 _Color; void surf(Input IN, inout SurfaceOutput o) { o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); } ENDCG

}

Fallback "Outlined/Silhouetted Diffuse" } </shaderlab>

Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox