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.



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" }
카테고리:shader