Purpose of implementation.

I was used screen space light texture technique (matcap or light-cap) since from 2006 in years.
And then my new stuff of new matcap technique (I called dual matcap technique) since by 2015 in years When I developed android mobile game in Korea.
Basically matcap technique is So famous tweak shader lighting technique for mobile games.But I curious Could I use to dual side of matcap?
So here is results.


Debug Sphere space capture for parabolic Map.

Complete code here.

Shader "ASE_DualMatcap"
{
	Properties
	{
		_FrontParaboloid ("_FrontParaboloid", 2D) = "white" { }
		_RearParaboloid ("_RearParaboloid", 2D) = "white" { }
		_Albedo("Albedo", 2D) = "white" {}
		_Float0("Float 0", Range( 0 , 2)) = 1
		[HideInInspector] _texcoord( "", 2D ) = "white" {}
		
	
	}
	
	SubShader
	{
		Tags { "RenderType"="Opaque" "LightMode" = "ForwardBase" }
		LOD 100
		Cull Off


		Pass
		{
			CGPROGRAM
			#pragma target 3.0 
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"


			struct appdata
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;	
				float4 texcoord : TEXCOORD0;
				float4 texcoord1 : TEXCOORD1;
				UNITY_VERTEX_INPUT_INSTANCE_ID
			};
			
			struct v2f
			{
				float4 vertex : SV_POSITION;
				float4 texcoord : TEXCOORD0;
				float3 worldNormal : TEXCOORD1;
				UNITY_VERTEX_OUTPUT_STEREO
			};

			
			uniform fixed4 _Color;
			uniform sampler2D _FrontParaboloid;
			uniform sampler2D _RearParaboloid;
			uniform sampler2D _Albedo;
			uniform float4 _Albedo_ST;
			uniform float _Float0;
			
			v2f vert ( appdata v )
			{
				v2f o;
				UNITY_SETUP_INSTANCE_ID(v);
				UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
				o.texcoord.xy = v.texcoord.xy;
				o.texcoord.zw = v.texcoord1.xy;
				
				// ase common template code
				
				v.vertex.xyz +=  float3(0,0,0) ;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.worldNormal = normalize(mul((float3x3)unity_ObjectToWorld, v.normal));
				return o;
			}

			inline fixed4 texParaboloidXFliped(sampler2D front, sampler2D back, float3 refl)
			{
				if (refl.x > 0)
				{
					float2 frontUv;
					frontUv.x = refl.z / (refl.x + 1);
					frontUv.y = refl.y / (refl.x + 1);
					frontUv = (frontUv * .5f) + 0.5f;
		
					frontUv.x = 1 - frontUv.x;

					return tex2D(front, frontUv);
				}
				else
				{
					float2 backUv;
					backUv.x = refl.z / (1 - refl.x);
					backUv.x *= -1;
					backUv.y = refl.y / (1 - refl.x);
					backUv = (backUv * .5f) + 0.5f;
	
					backUv.x = backUv.x;
		
					return tex2D(back, backUv);
				}
			}
			
			fixed4 frag (v2f i ) : SV_Target
			{
				fixed4 parabolicOut;
				// ase common template code
				float2 uv_Albedo = i.texcoord.xy * _Albedo_ST.xy + _Albedo_ST.zw;
				
				
				parabolicOut = ( float4(1,1,1,0) * ( tex2D( _Albedo, uv_Albedo ) * _Float0 ) );
				//return myColorVar;
				return parabolicOut * texParaboloidXFliped(_FrontParaboloid, _RearParaboloid, i.worldNormal);;
			}
			ENDCG
		}
	}
	CustomEditor "ASEMaterialInspector"
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s