Working materials with two modes - binary and continuous

This commit is contained in:
Michal Pikulski
2025-12-10 12:12:30 +01:00
parent b3ba4c35f3
commit 5de62563cf
16 changed files with 791 additions and 760 deletions

View File

@@ -0,0 +1,106 @@
Shader "TrashMaze/ObjectVisibilityProgressive"
{
Properties
{
_MainTex ("Normal Texture (Color)", 2D) = "white" {}
_OutlineTex ("Outline Texture (White)", 2D) = "white" {}
_RevealMask ("Reveal Mask", 2D) = "black" {}
[PerRendererData] _IsInVision ("Is In Vision", Float) = 0
}
SubShader
{
Tags
{
"Queue"="Transparent"
"RenderType"="Transparent"
"IgnoreProjector"="True"
}
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 positionCS : SV_POSITION;
float3 positionWS : TEXCOORD1;
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
TEXTURE2D(_OutlineTex);
SAMPLER(sampler_OutlineTex);
TEXTURE2D(_RevealMask);
SAMPLER(sampler_RevealMask);
float4 _MainTex_ST;
// Global shader properties (set by PulverController)
float2 _PlayerWorldPos;
float _VisionRadius;
Varyings vert(Attributes input)
{
Varyings output;
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
output.positionCS = vertexInput.positionCS;
output.positionWS = vertexInput.positionWS;
output.uv = TRANSFORM_TEX(input.uv, _MainTex);
return output;
}
half4 frag(Varyings input) : SV_Target
{
// Sample reveal mask (0 = not revealed, 1 = revealed)
float revealAmount = SAMPLE_TEXTURE2D(_RevealMask, sampler_RevealMask, input.uv).r;
// Binary decision: is this pixel revealed?
bool isRevealed = revealAmount > 0.5;
// If pixel was never revealed, hide it completely
if (!isRevealed)
{
return half4(0, 0, 0, 0);
}
// Calculate per-pixel distance to player in world space
float2 pixelWorldPos = input.positionWS.xy;
float distanceToPlayer = distance(pixelWorldPos, _PlayerWorldPos);
// Three-state logic per pixel:
// 1. Never revealed -> hide (handled above)
// 2. Revealed + currently in player vision radius -> show color
// 3. Revealed + outside player vision radius -> show outline
if (distanceToPlayer < _VisionRadius)
{
// Pixel is revealed AND currently in vision - show color
return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
}
else
{
// Pixel is revealed but NOT currently in vision - show outline
return SAMPLE_TEXTURE2D(_OutlineTex, sampler_OutlineTex, input.uv);
}
}
ENDHLSL
}
}
FallBack "Transparent/Diffuse"
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 732fa975ac924d89bb0078279d2cdb0b
timeCreated: 1765358086

View File

@@ -0,0 +1,64 @@
Shader "Hidden/TrashMaze/RevealStamp"
{
Properties
{
_StampPos ("Stamp Position", Vector) = (0.5, 0.5, 0, 0)
_StampRadius ("Stamp Radius", Float) = 0.2
}
SubShader
{
Tags { "Queue"="Overlay" "RenderType"="Opaque" }
// Additive blend to accumulate stamps
Blend One One
ZTest Always
ZWrite Off
Cull Off
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _StampPos;
float _StampRadius;
Varyings vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.uv = input.uv;
return output;
}
half4 frag(Varyings input) : SV_Target
{
// Calculate distance from stamp center
float dist = distance(input.uv, _StampPos.xy);
// Binary circle: 1.0 inside radius, 0.0 outside
float alpha = dist < _StampRadius ? 1.0 : 0.0;
// Return white with calculated alpha (additive blend accumulates)
return half4(alpha, alpha, alpha, alpha);
}
ENDHLSL
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 33afb80a55e64e53b8552498ad61acfa
timeCreated: 1765358067