111 lines
3.1 KiB
Plaintext
111 lines
3.1 KiB
Plaintext
Shader "Blocks/VoxelLit"
|
||
{
|
||
Properties
|
||
{
|
||
_MainTexArray ("Texture Array", 2DArray) = "" {}
|
||
}
|
||
|
||
SubShader
|
||
{
|
||
Tags { "RenderType"="Opaque" }
|
||
LOD 100
|
||
Cull Off // рендерим обе стороны граней — нужно для видимости стен внутри ям
|
||
|
||
Pass
|
||
{
|
||
Tags { "LightMode"="ForwardBase" }
|
||
|
||
CGPROGRAM
|
||
#pragma vertex vert
|
||
#pragma fragment frag
|
||
#pragma multi_compile_fog
|
||
#pragma multi_compile_fwdbase
|
||
#pragma target 3.5
|
||
#pragma require 2darray
|
||
|
||
#include "UnityCG.cginc"
|
||
#include "AutoLight.cginc"
|
||
|
||
UNITY_DECLARE_TEX2DARRAY(_MainTexArray);
|
||
|
||
struct appdata
|
||
{
|
||
float4 vertex : POSITION;
|
||
float2 uv : TEXCOORD0; // UV грани 0-1
|
||
float2 uv2 : TEXCOORD1; // x = texIndex, y = face brightness
|
||
};
|
||
|
||
struct v2f
|
||
{
|
||
float4 pos : SV_POSITION;
|
||
float3 uvTex : TEXCOORD0; // xy = UV, z = texIndex
|
||
float bright : TEXCOORD1; // face brightness (0.5 – 1.0)
|
||
UNITY_FOG_COORDS(2)
|
||
SHADOW_COORDS(3)
|
||
};
|
||
|
||
v2f vert(appdata v)
|
||
{
|
||
v2f o;
|
||
o.pos = UnityObjectToClipPos(v.vertex);
|
||
o.uvTex = float3(v.uv, v.uv2.x);
|
||
o.bright = v.uv2.y;
|
||
UNITY_TRANSFER_FOG(o, o.pos);
|
||
TRANSFER_SHADOW(o);
|
||
return o;
|
||
}
|
||
|
||
fixed4 frag(v2f i) : SV_Target
|
||
{
|
||
fixed4 col = UNITY_SAMPLE_TEX2DARRAY(_MainTexArray, i.uvTex);
|
||
|
||
// Minecraft-стиль освещения: фиксированная яркость по направлению грани
|
||
col.rgb *= i.bright;
|
||
|
||
// Тени от directional light
|
||
fixed shadow = SHADOW_ATTENUATION(i);
|
||
col.rgb *= lerp(0.5, 1.0, shadow);
|
||
|
||
UNITY_APPLY_FOG(i.fogCoord, col);
|
||
return col;
|
||
}
|
||
ENDCG
|
||
}
|
||
|
||
// Shadow caster pass — нужен чтобы чанки отбрасывали тени
|
||
Pass
|
||
{
|
||
Tags { "LightMode"="ShadowCaster" }
|
||
Cull Off
|
||
|
||
CGPROGRAM
|
||
#pragma vertex vert
|
||
#pragma fragment frag
|
||
#pragma multi_compile_shadowcaster
|
||
#pragma target 3.5
|
||
|
||
#include "UnityCG.cginc"
|
||
|
||
struct appdata { float4 vertex : POSITION; };
|
||
|
||
struct v2f
|
||
{
|
||
V2F_SHADOW_CASTER;
|
||
};
|
||
|
||
v2f vert(appdata v)
|
||
{
|
||
v2f o;
|
||
TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
|
||
return o;
|
||
}
|
||
|
||
fixed4 frag(v2f i) : SV_Target
|
||
{
|
||
SHADOW_CASTER_FRAGMENT(i)
|
||
}
|
||
ENDCG
|
||
}
|
||
}
|
||
}
|