2023-09-24 04:38:25 +00:00
|
|
|
Shader "Hidden/SSCC"
|
|
|
|
{
|
2023-12-11 07:00:09 +00:00
|
|
|
Properties
|
|
|
|
{
|
|
|
|
_MainTex("", any) = "" {}
|
|
|
|
_SSCCTexture("", any) = "" {}
|
|
|
|
}
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
CGINCLUDE
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
#define HLSL 0
|
2023-09-24 04:38:25 +00:00
|
|
|
#pragma target 3.0
|
|
|
|
#pragma editor_sync_compilation
|
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
#pragma multi_compile_local __ DEBUG_EFFECT DEBUG_NORMALS
|
|
|
|
#pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
|
|
|
|
#pragma multi_compile_local __ NORMALS_CAMERA NORMALS_RECONSTRUCT
|
|
|
|
#pragma multi_compile_local CAVITY_SAMPLES_6 CAVITY_SAMPLES_8 CAVITY_SAMPLES_12 CAVITY_SAMPLES_20
|
|
|
|
#pragma multi_compile_local __ SATURATE_CAVITY
|
|
|
|
#pragma multi_compile_local __ OUTPUT_TO_TEXTURE
|
|
|
|
#pragma multi_compile_local __ UPSCALE_CAVITY
|
|
|
|
|
2023-09-24 04:38:25 +00:00
|
|
|
#include "UnityCG.cginc"
|
|
|
|
|
|
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
2023-12-11 07:00:09 +00:00
|
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CavityTex);
|
2023-09-24 04:38:25 +00:00
|
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);
|
|
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraGBufferTexture2);
|
|
|
|
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
|
2023-12-11 07:00:09 +00:00
|
|
|
SamplerState sampler_LinearClamp;
|
|
|
|
SamplerState sampler_PointClamp;
|
2023-09-24 04:38:25 +00:00
|
|
|
|
|
|
|
CBUFFER_START(FrequentlyUpdatedUniforms)
|
2023-12-11 07:00:09 +00:00
|
|
|
//float4 _UVToView;
|
2023-09-24 04:38:25 +00:00
|
|
|
float4 _Input_TexelSize;
|
2023-12-11 07:00:09 +00:00
|
|
|
float4 _CavityTex_TexelSize;
|
|
|
|
float4x4 _WorldToCameraMatrix;
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
float _EffectIntensity;
|
|
|
|
float _DistanceFade;
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
float _CurvaturePixelRadius;
|
|
|
|
float _CurvatureBrights;
|
|
|
|
float _CurvatureDarks;
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
float _CavityWorldRadius;
|
|
|
|
float _CavityBrights;
|
|
|
|
float _CavityDarks;
|
|
|
|
CBUFFER_END
|
2023-09-24 04:38:25 +00:00
|
|
|
|
|
|
|
CBUFFER_START(PerPassUpdatedUniforms)
|
|
|
|
float4 _UVTransform;
|
|
|
|
CBUFFER_END
|
|
|
|
|
|
|
|
struct Attributes
|
|
|
|
{
|
|
|
|
float3 vertex : POSITION;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Varyings
|
|
|
|
{
|
|
|
|
float4 vertex : SV_POSITION;
|
|
|
|
float2 uv : TEXCOORD0;
|
|
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
|
|
};
|
|
|
|
|
|
|
|
float2 TransformTriangleVertexToUV(float2 vertex)
|
|
|
|
{
|
|
|
|
float2 uv = (vertex + 1.0) * 0.5;
|
|
|
|
return uv;
|
|
|
|
}
|
2023-12-11 07:00:09 +00:00
|
|
|
|
2023-09-24 04:38:25 +00:00
|
|
|
Varyings Vert_Default(Attributes input)
|
|
|
|
{
|
|
|
|
Varyings o;
|
|
|
|
|
|
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
|
|
UNITY_INITIALIZE_OUTPUT(Varyings, o);
|
|
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
|
|
|
|
o.vertex = float4(input.vertex.xy, 0.0, 1.0);
|
|
|
|
o.uv = TransformTriangleVertexToUV(input.vertex.xy);
|
|
|
|
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
|
|
o.uv = o.uv * float2(1.0, -1.0) + float2(0.0, 1.0);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
|
|
|
|
|
|
return o;
|
|
|
|
}
|
2023-12-11 07:00:09 +00:00
|
|
|
|
2023-09-24 04:38:25 +00:00
|
|
|
Varyings Vert_UVTransform(Attributes input)
|
|
|
|
{
|
|
|
|
Varyings o;
|
|
|
|
|
|
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
|
|
UNITY_INITIALIZE_OUTPUT(Varyings, o);
|
|
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
|
|
|
|
o.vertex = float4(input.vertex.xy, 0.0, 1.0);
|
|
|
|
o.uv = TransformTriangleVertexToUV(input.vertex.xy) * _UVTransform.xy + _UVTransform.zw;
|
|
|
|
|
|
|
|
o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
|
|
|
|
|
|
return o;
|
|
|
|
}
|
2023-12-11 07:00:09 +00:00
|
|
|
|
|
|
|
//
|
|
|
|
inline half4 FetchSceneColor(float2 uv) {
|
|
|
|
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, uv);
|
|
|
|
}
|
|
|
|
inline float FetchRawDepth(float2 uv) {
|
|
|
|
return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv);
|
|
|
|
}
|
|
|
|
inline float LinearizeDepth(float depth) {
|
|
|
|
#if ORTHOGRAPHIC_PROJECTION
|
|
|
|
#if UNITY_REVERSED_Z
|
|
|
|
depth = 1 - depth;
|
|
|
|
#endif
|
|
|
|
float linearDepth = _ProjectionParams.y + depth * (_ProjectionParams.z - _ProjectionParams.y);
|
|
|
|
#else
|
|
|
|
float linearDepth = LinearEyeDepth(depth);
|
|
|
|
#endif
|
|
|
|
return linearDepth;
|
|
|
|
}
|
|
|
|
inline float3 FetchViewPos(float2 uv) {
|
|
|
|
float depth = LinearizeDepth(FetchRawDepth(uv));
|
|
|
|
//return float3((uv * _UVToView.xy + _UVToView.zw) * depth, depth);
|
|
|
|
float4 UVToView = float4(2 / unity_CameraProjection._m00, -2 / unity_CameraProjection._m11, -1 / unity_CameraProjection._m00, 1 / unity_CameraProjection._m11);
|
|
|
|
#if ORTHOGRAPHIC_PROJECTION
|
|
|
|
return float3((uv * UVToView.xy + UVToView.zw), depth);
|
|
|
|
#else
|
|
|
|
return float3((uv * UVToView.xy + UVToView.zw) * depth, depth);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
inline float3 MinDiff(float3 P, float3 Pr, float3 Pl) {
|
|
|
|
float3 V1 = Pr - P;
|
|
|
|
float3 V2 = P - Pl;
|
|
|
|
return (dot(V1, V1) < dot(V2, V2)) ? V1 : V2;
|
|
|
|
}
|
|
|
|
inline float3 FetchViewNormals(float3 P, float2 uv) {
|
|
|
|
#if NORMALS_RECONSTRUCT
|
|
|
|
float c = FetchRawDepth(uv);
|
|
|
|
half3 viewSpacePos_c = FetchViewPos(uv);
|
|
|
|
// get data at 1 pixel offsets in each major direction
|
|
|
|
half3 viewSpacePos_l = FetchViewPos(uv + float2(-1.0, 0.0) * _Input_TexelSize.xy);
|
|
|
|
half3 viewSpacePos_r = FetchViewPos(uv + float2(+1.0, 0.0) * _Input_TexelSize.xy);
|
|
|
|
half3 viewSpacePos_d = FetchViewPos(uv + float2(0.0, -1.0) * _Input_TexelSize.xy);
|
|
|
|
half3 viewSpacePos_u = FetchViewPos(uv + float2(0.0, +1.0) * _Input_TexelSize.xy);
|
|
|
|
half3 l = viewSpacePos_c - viewSpacePos_l;
|
|
|
|
half3 r = viewSpacePos_r - viewSpacePos_c;
|
|
|
|
half3 d = viewSpacePos_c - viewSpacePos_d;
|
|
|
|
half3 u = viewSpacePos_u - viewSpacePos_c;
|
|
|
|
half4 H = half4(
|
|
|
|
FetchRawDepth(uv + float2(-1.0, 0.0) * _Input_TexelSize.xy),
|
|
|
|
FetchRawDepth(uv + float2(+1.0, 0.0) * _Input_TexelSize.xy),
|
|
|
|
FetchRawDepth(uv + float2(-2.0, 0.0) * _Input_TexelSize.xy),
|
|
|
|
FetchRawDepth(uv + float2(+2.0, 0.0) * _Input_TexelSize.xy)
|
|
|
|
);
|
|
|
|
half4 V = half4(
|
|
|
|
FetchRawDepth(uv + float2(0.0, -1.0) * _Input_TexelSize.xy),
|
|
|
|
FetchRawDepth(uv + float2(0.0, +1.0) * _Input_TexelSize.xy),
|
|
|
|
FetchRawDepth(uv + float2(0.0, -2.0) * _Input_TexelSize.xy),
|
|
|
|
FetchRawDepth(uv + float2(0.0, +2.0) * _Input_TexelSize.xy)
|
|
|
|
);
|
|
|
|
half2 he = abs((2 * H.xy - H.zw) - c);
|
|
|
|
half2 ve = abs((2 * V.xy - V.zw) - c);
|
|
|
|
half3 hDeriv = he.x < he.y ? l : r;
|
|
|
|
half3 vDeriv = ve.x < ve.y ? d : u;
|
|
|
|
float3 N = normalize(cross(hDeriv, vDeriv));
|
|
|
|
#else
|
|
|
|
#if NORMALS_CAMERA
|
|
|
|
float3 N = DecodeViewNormalStereo(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv));
|
|
|
|
#else
|
|
|
|
float3 N = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraGBufferTexture2, uv).rgb * 2.0 - 1.0;
|
|
|
|
N = mul((float3x3)_WorldToCameraMatrix, N);
|
|
|
|
#endif
|
|
|
|
N = float3(N.x, -N.yz);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
N = float3(N.x, -N.y, N.z);
|
|
|
|
return N;
|
|
|
|
}
|
|
|
|
//
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
ENDCG
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
SubShader
|
|
|
|
{
|
2023-09-24 04:38:25 +00:00
|
|
|
LOD 100
|
2023-12-11 07:00:09 +00:00
|
|
|
ZWrite Off ZTest Always Cull Off
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
Pass // 0
|
|
|
|
{
|
2023-09-24 04:38:25 +00:00
|
|
|
Name "Copy"
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex Vert_Default
|
|
|
|
#pragma fragment Frag
|
|
|
|
half4 Frag(Varyings input) : SV_Target
|
|
|
|
{
|
|
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
|
|
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, input.uv);
|
|
|
|
}
|
|
|
|
ENDCG
|
|
|
|
}
|
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
Pass // 1
|
|
|
|
{
|
|
|
|
Name "GenerateCavity"
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex Vert_Default
|
|
|
|
#pragma fragment Cavity_Frag
|
|
|
|
#include "Shared.cginc"
|
|
|
|
ENDCG
|
|
|
|
}
|
|
|
|
|
|
|
|
Pass // 2
|
|
|
|
{
|
|
|
|
Name "HorizontalBlur"
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex Vert_Default
|
|
|
|
#pragma fragment HorizontalBlur_Frag
|
|
|
|
#include "Shared.cginc"
|
|
|
|
ENDCG
|
|
|
|
}
|
|
|
|
|
|
|
|
Pass // 3
|
|
|
|
{
|
|
|
|
Name "VerticalBlur"
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex Vert_Default
|
|
|
|
#pragma fragment VerticalBlur_Frag
|
|
|
|
#include "Shared.cginc"
|
|
|
|
ENDCG
|
|
|
|
}
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
Pass // 4
|
|
|
|
{
|
|
|
|
Name "Final"
|
2023-09-24 04:38:25 +00:00
|
|
|
ColorMask RGB
|
|
|
|
CGPROGRAM
|
2023-12-11 07:00:09 +00:00
|
|
|
#pragma vertex Vert_Default
|
|
|
|
#pragma fragment Composite_Frag
|
|
|
|
#include "Shared.cginc"
|
2023-09-24 04:38:25 +00:00
|
|
|
ENDCG
|
|
|
|
}
|
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
}
|
2023-09-24 04:38:25 +00:00
|
|
|
|
2023-12-11 07:00:09 +00:00
|
|
|
Fallback Off
|
|
|
|
}
|