forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Custom shader to draw our toy cubes and balls with an outline around them.
 | 
						|
Shader "Custom/ToyCubeOutline" 
 | 
						|
{
 | 
						|
	Properties 
 | 
						|
	{
 | 
						|
		_Color("Color", Color) = (1,1,1,1)
 | 
						|
		_MainTex("Albedo", 2D) = "white" {}
 | 
						|
		[PerRendererData] _OutlineColor ("Outline Color", Color) = (0,0,0,1)
 | 
						|
		_OutlineWidth ("Outline width", Range (.002, 0.03)) = .005
 | 
						|
		
 | 
						|
		[HideInInspector] _Mode ("__mode", Float) = 0.0
 | 
						|
		[HideInInspector] _SrcBlend ("__src", Float) = 1.0
 | 
						|
		[HideInInspector] _DstBlend ("__dst", Float) = 0.0
 | 
						|
		[HideInInspector] _ZWrite ("__zw", Float) = 1.0
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
	CGINCLUDE
 | 
						|
	#include "UnityCG.cginc"
 | 
						|
	
 | 
						|
	struct appdata 
 | 
						|
	{
 | 
						|
		float4 vertex : POSITION;
 | 
						|
		float3 normal : NORMAL;
 | 
						|
 | 
						|
		UNITY_VERTEX_INPUT_INSTANCE_ID
 | 
						|
	};
 | 
						|
 | 
						|
	struct v2f 
 | 
						|
	{
 | 
						|
		float4 pos : SV_POSITION;
 | 
						|
		fixed4 color : COLOR;
 | 
						|
 | 
						|
		UNITY_VERTEX_OUTPUT_STEREO
 | 
						|
	};
 | 
						|
	
 | 
						|
	uniform float _OutlineWidth;
 | 
						|
	uniform float4 _OutlineColor;
 | 
						|
	uniform float4x4 _ObjectToWorldFixed;
 | 
						|
	
 | 
						|
	// Pushes the verts out a little from the object center.
 | 
						|
	// Lets us give an outline to objects that all have normals facing away from the center.
 | 
						|
	// If we can't assume that, we need to tweak the math of this shader.
 | 
						|
	v2f vert(appdata v) 
 | 
						|
	{
 | 
						|
		v2f o;
 | 
						|
 | 
						|
		UNITY_SETUP_INSTANCE_ID(v);
 | 
						|
		UNITY_INITIALIZE_OUTPUT(v2f, o);
 | 
						|
		UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
 | 
						|
 | 
						|
		// MTF TODO 
 | 
						|
		// 1. Fix batching so that it actually occurs.
 | 
						|
		// 2. See if batching causes problems,
 | 
						|
		// if it does fix this line by adding that component that sets it.
 | 
						|
		//float4 objectCenterWorld = mul(_ObjectToWorldFixed, float4(0.0, 0.0, 0.0, 1.0));
 | 
						|
		float4 objectCenterWorld = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0));
 | 
						|
		float4 vertWorld = mul(unity_ObjectToWorld, v.vertex);
 | 
						|
 | 
						|
		float3 offsetDir = vertWorld.xyz - objectCenterWorld.xyz;
 | 
						|
		offsetDir = normalize(offsetDir) * _OutlineWidth;
 | 
						|
 | 
						|
		o.pos = UnityWorldToClipPos(vertWorld+offsetDir);
 | 
						|
 | 
						|
		o.color = _OutlineColor;
 | 
						|
		return o;
 | 
						|
	}
 | 
						|
	ENDCG
 | 
						|
 | 
						|
	SubShader 
 | 
						|
	{
 | 
						|
		Tags { "Queue" = "Transparent" }
 | 
						|
		Pass 
 | 
						|
		{
 | 
						|
			Name "OUTLINE"
 | 
						|
			// To allow the cube to render entirely on top of the outline.
 | 
						|
			ZWrite Off
 | 
						|
			Blend SrcAlpha OneMinusSrcAlpha
 | 
						|
 | 
						|
			CGPROGRAM
 | 
						|
			#pragma vertex vert
 | 
						|
			#pragma fragment frag
 | 
						|
			fixed4 frag(v2f i) : SV_Target
 | 
						|
			{
 | 
						|
				// Just draw the _OutlineColor from the vert pass above.
 | 
						|
				return i.color;
 | 
						|
			}
 | 
						|
			ENDCG
 | 
						|
		}
 | 
						|
		// Standard forward render.
 | 
						|
		UsePass "Standard/FORWARD"
 | 
						|
	}
 | 
						|
	
 | 
						|
	Fallback Off
 | 
						|
} |