87 lines
No EOL
2.3 KiB
Text
87 lines
No EOL
2.3 KiB
Text
/*
|
|
|
|
This is most expensive light shader with variable count of path tracking steps.
|
|
That shader could be used only on desktop / consoles due to poor performance and required features.
|
|
|
|
*/
|
|
|
|
|
|
Shader "Light2D/Light Auto Points" {
|
|
Properties {
|
|
_MainTex ("Light texture", 2D) = "white" {}
|
|
_ObstacleMul ("Obstacle Mul", Float) = 500
|
|
_EmissionColorMul ("Emission color mul", Float) = 1
|
|
_StepCountMul ("Raytracking point count multiplier", Float) = 2
|
|
}
|
|
SubShader {
|
|
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
|
|
|
|
LOD 100
|
|
Blend OneMinusDstColor One
|
|
Cull Off
|
|
ZWrite Off
|
|
Lighting Off
|
|
|
|
Pass {
|
|
CGPROGRAM
|
|
#pragma target 3.0 // replace with 4.0 if you see glitches with big _StepCountMul or texture resolution.
|
|
#pragma multi_compile ORTHOGRAPHIC_CAMERA PERSPECTIVE_CAMERA
|
|
#pragma glsl_no_auto_normalization
|
|
#pragma glsl
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "LightBase.cginc"
|
|
|
|
#pragma vertex light2d_fixed_vert
|
|
#pragma fragment frag
|
|
|
|
uniform half _StepCountMul;
|
|
|
|
half4 frag (light2d_fixed_v2f i) : COLOR
|
|
{
|
|
half4 tex = tex2D(_MainTex, i.texcoord);
|
|
|
|
#ifdef PERSPECTIVE_CAMERA
|
|
half4 vPos = ComputeScreenPos(i.projVertex);
|
|
half2 thisPos = (vPos.xy/vPos.w - 0.5)*_ExtendedToSmallTextureScale + 0.5;
|
|
half4 cPos = ComputeScreenPos(mul(UNITY_MATRIX_VP, float4(i.texcoord1, 0, 1)));
|
|
half2 centerPos = (cPos.xy/cPos.w - 0.5)*_ExtendedToSmallTextureScale + 0.5;
|
|
#ifdef UNITY_HALF_TEXEL_OFFSET
|
|
thisPos += _PosOffset;
|
|
centerPos += _PosOffset;
|
|
#endif
|
|
#else
|
|
half2 thisPos = i.thisPos;
|
|
half2 centerPos = i.centerPos;
|
|
#endif
|
|
|
|
half pixelSize = 1.0/_ScreenParams.y;
|
|
half len = length((thisPos - centerPos)*i.aspect);
|
|
int steps = round(_StepCountMul * len / pixelSize);
|
|
|
|
half sub = 1.0/steps;
|
|
half m = _ObstacleMul*sub*len;
|
|
|
|
half4 col = i.color*tex*tex.a*i.color.a;
|
|
|
|
half pos = 0;
|
|
|
|
|
|
for(half i = 0; i < steps; i++)
|
|
{
|
|
pos += sub;
|
|
half4 obstacle = tex2Dlod(_ObstacleTex, half4(lerp(centerPos, thisPos, pos), 0, 0));
|
|
col *= saturate(1 - (1 - obstacle)*obstacle.a*m);
|
|
}
|
|
|
|
col.rgb *= _EmissionColorMul;
|
|
|
|
return col;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
|
|
Fallback "Light2D/Light 80 Points"
|
|
|
|
} |