Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if !defined(LIGHTING_INCLUDED)
- #define LIGHTING_INCLUDED
- #include "UnityPBSLighting.cginc"
- #include "AutoLight.cginc"
- #include "UnityCG.cginc"
- float4 _Ambient;
- sampler2D _MainTex;
- sampler2D _NormalMap;
- float4 _MainTex_ST;
- float _ToonAmount;
- struct VertexData
- {
- float4 vertex: POSITION;
- float3 normal: NORMAL;
- float4 tangent: TANGENT;
- float2 uv: TEXCOORD0;
- };
- struct Interpolators
- {
- float4 pos: SV_POSITION;
- float2 uv: TEXCOORD0;
- float3 normal: TEXCOORD1;
- float4 tangent: TEXCOORD2;
- float3 worldPos: TEXCOORD4;
- SHADOW_COORDS(5)
- #if defined(VERTEXLIGHT_ON)
- float3 vertexLightColor: TEXCOORD6;
- #endif
- };
- void ComputeVertexLightColor(inout Interpolators i)
- {
- #if defined(VERTEXLIGHT_ON)
- i.vertexLightColor = Shade4PointLights(
- unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
- unity_LightColor[0].rgb, unity_LightColor[1].rgb,
- unity_LightColor[2].rgb, unity_LightColor[3].rgb,
- unity_4LightAtten0, i.worldPos, i.normal
- );
- #endif
- }
- Interpolators vert(VertexData v)
- {
- Interpolators i;
- #if defined(MANUAL_BILLBOARD)
- i.pos = UnityObjectToClipPos(v.vertex);
- i.normal = UnityObjectToWorldNormal(v.normal);
- i.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
- i.worldPos = mul(unity_ObjectToWorld, v.vertex);
- #else
- // i.pos = mul(UNITY_MATRIX_P,
- // mul(UNITY_MATRIX_MV, float4(0, 0, 0, 1))
- // + float4(v.vertex.x, v.vertex.y, 0, 0));
- float4 world_origin = mul(UNITY_MATRIX_M, float4(0, 0, 0, 1));
- float4 view_origin = float4(UnityObjectToViewPos(float3(0, 0, 0)), 1);
- float4 world_pos = mul(UNITY_MATRIX_M, v.vertex);
- float4 view_pos = world_pos - world_origin + view_origin;
- float4 clip_pos = mul(UNITY_MATRIX_P, view_pos);
- i.pos = clip_pos;
- i.normal = -1 * normalize(unity_CameraToWorld._m02_m12_m22);
- //This tangent calculation uses (0, 1, 0) to generate the perpendicular value (tangent)
- //Could be modified to fit other vectors
- //I also don't know why w is negative but it works
- i.tangent = normalize(float4(i.normal.z * -1, 0, i.normal.x, -1));
- //i.worldPos = mul(unity_ObjectToWorld, mul(UNITY_MATRIX_MV, float4(0, 0, 0, 1)) + float4(v.vertex.x, v.vertex.y, 0, 0));
- //i.worldPos = mul(unity_ObjectToWorld, v.vertex);
- i.worldPos = view_pos;
- v.vertex = float4(0, 0, 0, 0);
- #endif
- i.uv = TRANSFORM_TEX(v.uv, _MainTex);
- // #if defined (SHADOWS_SCREEN)
- // #if defined (UNITY_NO_SCREENSPACE_SHADOWS)
- // i._ShadowCoord = mul( unity_WorldToShadow[0], world_pos );
- // #else
- // i._ShadowCoord = ComputeScreenPos(i.pos);
- // #endif
- // #endif
- // #if defined (SHADOWS_DEPTH) && defined (SPOT)
- // i._ShadowCoord = mul (unity_WorldToShadow[0], world_pos);
- // #endif
- // #if defined (SHADOWS_CUBED)
- // i._ShadowCoord.xyz = world_pos.xyz - _LightPositionRange.xyz;
- // #endif
- TRANSFER_SHADOW(i)
- ComputeVertexLightColor(i);
- return i;
- }
- //ShadowsScreen && UNITY_NO_SCREENSPACE_SHADOWS
- //#define TRANSFER_SHADOW(a) a._ShadowCoord = mul( unity_WorldToShadow[0], mul( unity_ObjectToWorld, v.vertex ) );
- //ShadowsScreen && !UNITY_NO_SCREENSPACE_SHADOWS
- //#define TRANSFER_SHADOW(a) a._ShadowCoord = ComputeScreenPos(a.pos);
- //SpotLight && ShadowsDepth
- //#define TRANSFER_SHADOW(a) a._ShadowCoord = mul (unity_WorldToShadow[0], mul(unity_ObjectToWorld,v.vertex));
- //ShadowsCubed (Point Light)
- //#define TRANSFER_SHADOW(a) a._ShadowCoord.xyz = mul(unity_ObjectToWorld, v.vertex).xyz - _LightPositionRange.xyz;
- UnityLight CreateLight(Interpolators i)
- {
- UnityLight light;
- #if defined(POINT) || defined(POINT_COOKIE) || defined(SPOT)
- light.dir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);
- #else
- light.dir = _WorldSpaceLightPos0.xyz;
- #endif
- UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos);
- light.color = _LightColor0.rgb * attenuation;
- light.ndotl = DotClamped(i.normal, light.dir);
- return light;
- }
- void InitializeFragmentNormal(inout Interpolators i)
- {
- float3 mainNormal = UnpackScaleNormal(tex2D(_NormalMap, i.uv), 1);
- float3 binormal = cross(i.normal, i.tangent.xyz) *
- (i.tangent.w * unity_WorldTransformParams.w);
- i.normal = normalize(
- mainNormal.x * i.tangent +
- mainNormal.y * binormal +
- mainNormal.z * i.normal
- );
- }
- float Toonify(float ndotl)
- {
- return round(ndotl * _ToonAmount) / _ToonAmount;
- }
- float4 frag(Interpolators i): SV_TARGET
- {
- InitializeFragmentNormal(i);
- float4 col = tex2D(_MainTex, i.uv);
- clip(col.a - 0.5);
- UnityLight light = CreateLight(i);
- UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos.xyz);
- atten /= 2;
- atten += 0.5;
- return col * atten * float4(_LightColor0.rgb * Toonify(light.ndotl) + _Ambient.rgb, 1);
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement