ToriaAssets/Sources/Shaders/Standard-AddPass.shader

166 lines
6.2 KiB
Plaintext
Raw Normal View History

2026-05-19 12:20:15 +02:00
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "TOZ/Object/TriProj/Terrain/Standard-AddPass" {
Properties {
// set by terrain engine
[HideInInspector] _Control("Control (RGBA)", 2D) = "red" {}
[HideInInspector] _Splat3("Layer 3 (A)", 2D) = "white" {}
[HideInInspector] _Splat2("Layer 2 (B)", 2D) = "white" {}
[HideInInspector] _Splat1("Layer 1 (G)", 2D) = "white" {}
[HideInInspector] _Splat0("Layer 0 (R)", 2D) = "white" {}
[HideInInspector] _Normal3("Normal 3 (A)", 2D) = "bump" {}
[HideInInspector] _Normal2("Normal 2 (B)", 2D) = "bump" {}
[HideInInspector] _Normal1("Normal 1 (G)", 2D) = "bump" {}
[HideInInspector] _Normal0("Normal 0 (R)", 2D) = "bump" {}
[HideInInspector] [Gamma] _Metallic0("Metallic 0", Range(0.0, 1.0)) = 0.0
[HideInInspector] [Gamma] _Metallic1("Metallic 1", Range(0.0, 1.0)) = 0.0
[HideInInspector] [Gamma] _Metallic2("Metallic 2", Range(0.0, 1.0)) = 0.0
[HideInInspector] [Gamma] _Metallic3("Metallic 3", Range(0.0, 1.0)) = 0.0
[HideInInspector] _Smoothness ("Smoothness", Range(0.0, 1.0)) = 0.0
}
SubShader {
Tags { "SplatCount" = "4" "Queue" = "Geometry-99" "RenderType" = "Opaque" "IgnoreProjector"="True" }
CGPROGRAM
#include "UnityPBSLighting.cginc"
#pragma target 3.0
//#pragma exclude_renderers gles
#pragma surface surf Standard decal:add vertex:vert finalcolor:myfinal exclude_path:prepass exclude_path:deferred
#pragma multi_compile_fog
#define TERRAIN_SPLAT_ADDPASS
#pragma multi_compile __ _TERRAIN_NORMAL_MAP
sampler2D _Control;
sampler2D _Splat0, _Splat1, _Splat2, _Splat3;
#ifdef _TERRAIN_NORMAL_MAP
sampler2D _Normal0, _Normal1, _Normal2, _Normal3;
#endif
float4 _Splat0_ST, _Splat1_ST, _Splat2_ST, _Splat3_ST;
half _Metallic0, _Metallic1, _Metallic2, _Metallic3;
half _Smoothness;
fixed _Blend;
float _TextureScale;
struct Input {
float2 uv_Control : TEXCOORD0;
float3 norm : TEXCOORD1;
float3 worldPos;
UNITY_FOG_COORDS(2)
};
void vert (inout appdata_full v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input, o);
fixed3 n = max(abs(v.normal) - _Blend, 0);
o.norm = n / (n.x + n.y + n.z).xxx;
float4 pos = UnityObjectToClipPos (v.vertex);
UNITY_TRANSFER_FOG(o, pos);
#ifdef _TERRAIN_NORMAL_MAP
v.tangent.xyz = cross(v.normal, float3(0, 0, 1));
v.tangent.w = -1;
#endif
}
void surf (Input IN, inout SurfaceOutputStandard o) {
//Unity 5 texture interpolators already fill in limits, and no room for packing
//So we do the uvs per pixel :(
float3 oPos = mul(unity_WorldToObject, fixed4(IN.worldPos, 1.0)).xyz * (1.0 / _TextureScale);
fixed4 splat_control = tex2D(_Control, IN.uv_Control);
half weight = dot(splat_control, half4(1, 1, 1, 1));
#ifndef UNITY_PASS_DEFERRED
splat_control /= (weight + 1e-3f); // avoid NaNs in splat_control
#endif
#if !defined(SHADER_API_MOBILE) && defined(TERRAIN_SPLAT_ADDPASS)
clip(weight - 0.0039 /*1/255*/);
#endif
float2 uvx, uvy, uvz;
fixed4 cx, cy, cz, col;
fixed4 nx, ny, nz, nrm;
//Splat0
uvx = (oPos.yz - _Splat0_ST.zw) * _Splat0_ST.xy;
uvy = (oPos.xz - _Splat0_ST.zw) * _Splat0_ST.xy;
uvz = (oPos.xy - _Splat0_ST.zw) * _Splat0_ST.xy;
cx = (splat_control.r * tex2D(_Splat0, uvx)) * IN.norm.xxxx;
cy = (splat_control.r * tex2D(_Splat0, uvy)) * IN.norm.yyyy;
cz = (splat_control.r * tex2D(_Splat0, uvz)) * IN.norm.zzzz;
col = (cx + cy + cz);
#ifdef _TERRAIN_NORMAL_MAP
nx = (splat_control.r * tex2D(_Normal0, uvx)) * IN.norm.xxxx;
ny = (splat_control.r * tex2D(_Normal0, uvy)) * IN.norm.yyyy;
nz = (splat_control.r * tex2D(_Normal0, uvz)) * IN.norm.zzzz;
nrm = (nx + ny + nz);
#endif
//Splat1
uvx = (oPos.yz - _Splat1_ST.zw) * _Splat1_ST.xy;
uvy = (oPos.xz - _Splat1_ST.zw) * _Splat1_ST.xy;
uvz = (oPos.xy - _Splat1_ST.zw) * _Splat1_ST.xy;
cx = (splat_control.g * tex2D(_Splat1, uvx)) * IN.norm.xxxx;
cy = (splat_control.g * tex2D(_Splat1, uvy)) * IN.norm.yyyy;
cz = (splat_control.g * tex2D(_Splat1, uvz)) * IN.norm.zzzz;
col += (cx + cy + cz);
#ifdef _TERRAIN_NORMAL_MAP
nx = (splat_control.g * tex2D(_Normal1, uvx)) * IN.norm.xxxx;
ny = (splat_control.g * tex2D(_Normal1, uvy)) * IN.norm.yyyy;
nz = (splat_control.g * tex2D(_Normal1, uvz)) * IN.norm.zzzz;
nrm += (nx + ny + nz);
#endif
//Splat2
uvx = (oPos.yz - _Splat2_ST.zw) * _Splat2_ST.xy;
uvy = (oPos.xz - _Splat2_ST.zw) * _Splat2_ST.xy;
uvz = (oPos.xy - _Splat2_ST.zw) * _Splat2_ST.xy;
cx = (splat_control.b * tex2D(_Splat2, uvx)) * IN.norm.xxxx;
cy = (splat_control.b * tex2D(_Splat2, uvy)) * IN.norm.yyyy;
cz = (splat_control.b * tex2D(_Splat2, uvz)) * IN.norm.zzzz;
col += (cx + cy + cz);
#ifdef _TERRAIN_NORMAL_MAP
nx = (splat_control.b * tex2D(_Normal2, uvx)) * IN.norm.xxxx;
ny = (splat_control.b * tex2D(_Normal2, uvy)) * IN.norm.yyyy;
nz = (splat_control.b * tex2D(_Normal2, uvz)) * IN.norm.zzzz;
nrm += (nx + ny + nz);
#endif
//Splat3
uvx = (oPos.yz - _Splat3_ST.zw) * _Splat3_ST.xy;
uvy = (oPos.xz - _Splat3_ST.zw) * _Splat3_ST.xy;
uvz = (oPos.xy - _Splat3_ST.zw) * _Splat3_ST.xy;
cx = (splat_control.a * tex2D(_Splat3, uvx)) * IN.norm.xxxx;
cy = (splat_control.a * tex2D(_Splat3, uvy)) * IN.norm.yyyy;
cz = (splat_control.a * tex2D(_Splat3, uvz)) * IN.norm.zzzz;
col += (cx + cy + cz);
#ifdef _TERRAIN_NORMAL_MAP
nx = (splat_control.a * tex2D(_Normal3, uvx)) * IN.norm.xxxx;
ny = (splat_control.a * tex2D(_Normal3, uvy)) * IN.norm.yyyy;
nz = (splat_control.a * tex2D(_Normal3, uvz)) * IN.norm.zzzz;
nrm += (nx + ny + nz);
#endif
//Sum
col.rgb *= weight;
o.Albedo = col.rgb;
#ifdef _TERRAIN_NORMAL_MAP
o.Normal = UnpackNormal(nrm);
#endif
o.Alpha = 1.0;
o.Smoothness = col.a * _Smoothness;
o.Metallic = dot(splat_control, half4(_Metallic0, _Metallic1, _Metallic2, _Metallic3));
}
void myfinal(Input IN, SurfaceOutputStandard o, inout fixed4 color) {
//Add fog last
#ifdef TERRAIN_SPLAT_ADDPASS
UNITY_APPLY_FOG_COLOR(IN.fogCoord, color, fixed4(0, 0, 0, 0));
#else
UNITY_APPLY_FOG(IN.fogCoord, color);
#endif
}
ENDCG
}
Fallback "Hidden/TerrainEngine/Splatmap/Standard-AddPass"
}