Files
my-project/Assets/Blocks/Shaders/VoxelLit.shader
2026-04-17 02:14:56 +05:00

111 lines
3.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
}
}