quality-control/Assets/Shaders/TriplanarStandard.shader
2024-08-17 11:18:11 +02:00

116 lines
2.9 KiB
Plaintext

Shader "Triplanar"
{
Properties
{
_Color("Main Color", Color) = (1,1,1,1)
_MainTex("Albedo Top", 2D) = "white" {}
_MainTex1("Albedo Front", 2D) = "white" {}
_MainTex2("Albedo Side", 2D) = "white" {}
_SizeX("SizeX", Float) = 20
_SizeY("SizeY", Float) = 20
_NX("NX", Range(0,1)) = 1
_NY("NY", Range(0,1)) = 1
_NZ("NZ", Range(0,1)) = 1
_PreventRepeatMult("Prevent Repeat Mult", Float) = 0
[MaterialToggle] _FlipTop("Flip Top", Float) = 0
//_SplatMap("Splat", 2D) = "white" {}
_OcclusionTex("Occlusion Map", 2D) = "white" {}
//_BumpMap0("Normal", 2D) = "white" {}
//_BumpMap1("Normal", 2D) = "white" {}
//_BumpMap2("Normal", 2D) = "white" {}
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard
#pragma target 3.0
sampler2D _MainTex;
sampler2D _MainTex1;
sampler2D _MainTex2;
fixed4 _Color;
fixed _NX;
fixed _NY;
fixed _NZ;
half _SizeX;
half _SizeY;
half _PreventRepeatMult;
//sampler2D _BumpMap0;
//sampler2D _BumpMap1;
//sampler2D _BumpMap2;
//sampler2D _SplatMap;
sampler2D _OcclusionTex;
uniform bool _FlipTop;
struct Input
{
half3 worldPos;
fixed3 worldNormal;
fixed2 uv_OcclusionTex;
INTERNAL_DATA
};
void surf(Input IN, inout SurfaceOutputStandard o)
{
half2 scale = half2(_SizeX, _SizeY);
float3 wp = IN.worldPos;
//float3 n = IN.worldNormal;
// top down
half2 uvy = (_FlipTop ? wp.xz : wp.zx) + wp.y * _PreventRepeatMult;
// sideways
half2 uvx = wp.zy + wp.x * _PreventRepeatMult;
half2 uvz = wp.xy + wp.z * _PreventRepeatMult;
//n.x * wp.yz + n.y * wp.xz + n.z * wp.xy;
fixed4 cy = tex2D(_MainTex, uvy / scale); // top down
fixed4 cx = tex2D(_MainTex2, uvx / scale); // left right
fixed4 cz = tex2D(_MainTex1, uvz / scale); // back forth
//fixed3 n0 = UnpackNormal(tex2D(_BumpMap0, IN.worldPos.xz / scale));
//fixed3 n1 = UnpackNormal(tex2D(_BumpMap1, IN.worldPos.xy / scale));
//fixed3 n2 = UnpackNormal(tex2D(_BumpMap2, IN.worldPos.zy / scale));
fixed occlusion = tex2D(_OcclusionTex, IN.uv_OcclusionTex.xy);
fixed3 nWNormal = Unity_SafeNormalize(IN.worldNormal*fixed3(_NX, _NY, _NZ));
//fixed3 nWNormal = IN.worldNormal;
fixed3 projnormal = saturate(pow(nWNormal*1.5, 4));
//fixed4 splatMap = tex2D(_SplatMap, IN.worldPos.xz / scale);
//fixed splat = splatMap.r;
// Sides
half4 result = lerp(cz, cx, projnormal.x);
// Top
result = lerp(result, cy, round(projnormal.y * (0.5+ result.r)));
//half3 resultBump = lerp(n0, n1, projnormal.z);
//resultBump = lerp(resultBump, n2, projnormal.x);
//normal = lerp(normal, half3(0, 1, 0), projnormal.z);
//half3 normal = resultBump;
//o.Normal = normal;
o.Albedo = result.rgb * _Color.rgb * occlusion;
o.Alpha = result.a * _Color.a;
o.Occlusion = occlusion;
//o.Normal = normal;
}
ENDCG
}
Fallback "VertexLit"
}