test mesh

This commit is contained in:
jze9
2026-04-17 02:14:56 +05:00
parent 087db550f1
commit 64293937a7
50 changed files with 2570 additions and 963 deletions

View File

@@ -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"
}