test mesh
This commit is contained in:
@@ -3,53 +3,108 @@ Shader "Blocks/VoxelLit"
|
||||
Properties
|
||||
{
|
||||
_MainTexArray ("Texture Array", 2DArray) = "" {}
|
||||
_Glossiness ("Smoothness", Range(0,1)) = 0.0
|
||||
_Metallic ("Metallic", Range(0,1)) = 0.0
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderType"="Opaque" }
|
||||
LOD 200
|
||||
LOD 100
|
||||
Cull Off // рендерим обе стороны граней — нужно для видимости стен внутри ям
|
||||
|
||||
CGPROGRAM
|
||||
// Standard surface shader с кастомным vertex для передачи texIndex
|
||||
#pragma surface surf Standard fullforwardshadows vertex:vert
|
||||
#pragma target 3.5
|
||||
#pragma require 2darray
|
||||
|
||||
UNITY_DECLARE_TEX2DARRAY(_MainTexArray);
|
||||
|
||||
struct Input
|
||||
Pass
|
||||
{
|
||||
float2 uv_MainTexArray; // стандартный UV (0-1 по грани)
|
||||
float texIndex; // индекс слоя в Texture2DArray
|
||||
};
|
||||
Tags { "LightMode"="ForwardBase" }
|
||||
|
||||
half _Glossiness;
|
||||
half _Metallic;
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma multi_compile_fog
|
||||
#pragma multi_compile_fwdbase
|
||||
#pragma target 3.5
|
||||
#pragma require 2darray
|
||||
|
||||
// Vertex-функция: читаем texIndex из канала UV1 (mesh.uv2)
|
||||
void vert(inout appdata_full v, out Input o)
|
||||
{
|
||||
UNITY_INITIALIZE_OUTPUT(Input, o);
|
||||
o.uv_MainTexArray = v.texcoord.xy;
|
||||
o.texIndex = v.texcoord1.x; // UV1.x = индекс текстуры
|
||||
#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
|
||||
}
|
||||
|
||||
void surf(Input IN, inout SurfaceOutputStandard o)
|
||||
// Shadow caster pass — нужен чтобы чанки отбрасывали тени
|
||||
Pass
|
||||
{
|
||||
fixed4 c = UNITY_SAMPLE_TEX2DARRAY(
|
||||
_MainTexArray,
|
||||
float3(IN.uv_MainTexArray, IN.texIndex)
|
||||
);
|
||||
o.Albedo = c.rgb;
|
||||
o.Metallic = _Metallic;
|
||||
o.Smoothness = _Glossiness;
|
||||
o.Alpha = c.a;
|
||||
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
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
FallBack "Diffuse"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user