465 lines
12 KiB
Plaintext
465 lines
12 KiB
Plaintext
Shader "Hidden/HBAO"
|
|
{
|
|
Properties {
|
|
_MainTex ("", any) = "" {}
|
|
_HBAOTex ("", any) = "" {}
|
|
_TempTex("", any) = "" {}
|
|
_NoiseTex("", 2D) = "" {}
|
|
_DepthTex("", any) = "" {}
|
|
_NormalsTex("", any) = "" {}
|
|
}
|
|
|
|
CGINCLUDE
|
|
|
|
#pragma target 3.0
|
|
#pragma editor_sync_compilation
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_HBAOTex);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_TempTex);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraGBufferTexture0); // diffuse color (RGB), occlusion (A)
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraGBufferTexture2); // normal (rgb), --unused-- (a)
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraMotionVectorsTexture);
|
|
UNITY_DECLARE_SCREENSPACE_TEXTURE(_NormalsTex);
|
|
UNITY_DECLARE_TEX2D(_NoiseTex);
|
|
|
|
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
|
|
UNITY_DECLARE_DEPTH_TEXTURE(_DepthTex);
|
|
|
|
CBUFFER_START(FrequentlyUpdatedUniforms)
|
|
float4 _Input_TexelSize;
|
|
float4 _AO_TexelSize;
|
|
float4 _DeinterleavedAO_TexelSize;
|
|
float4 _ReinterleavedAO_TexelSize;
|
|
float4 _TargetScale;
|
|
float4 _UVToView[2];
|
|
//float4x4 _WorldToCameraMatrix;
|
|
float _Radius[2];
|
|
float _MaxRadiusPixels;
|
|
float _NegInvRadius2;
|
|
float _AngleBias;
|
|
float _AOmultiplier;
|
|
float _Intensity;
|
|
half4 _BaseColor;
|
|
float _MultiBounceInfluence;
|
|
float _OffscreenSamplesContrib;
|
|
float _MaxDistance;
|
|
float _DistanceFalloff;
|
|
float _BlurSharpness;
|
|
float _ColorBleedSaturation;
|
|
float _AlbedoMultiplier;
|
|
float _ColorBleedBrightnessMask;
|
|
float2 _ColorBleedBrightnessMaskRange;
|
|
float2 _TemporalParams;
|
|
CBUFFER_END
|
|
|
|
CBUFFER_START(PerPassUpdatedUniforms)
|
|
float4 _UVTransform;
|
|
float2 _BlurDeltaUV;
|
|
CBUFFER_END
|
|
|
|
CBUFFER_START(PerPassUpdatedDeinterleavingUniforms)
|
|
float2 _Deinterleave_Offset00;
|
|
float2 _Deinterleave_Offset10;
|
|
float2 _Deinterleave_Offset01;
|
|
float2 _Deinterleave_Offset11;
|
|
float2 _AtlasOffset;
|
|
float2 _Jitter;
|
|
CBUFFER_END
|
|
|
|
struct Attributes
|
|
{
|
|
float3 vertex : POSITION;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
//float2 uvStereo : TEXCOORD1;
|
|
//#if STEREO_INSTANCING_ENABLED
|
|
//uint stereoTargetEyeIndex : SV_RenderTargetArrayIndex;
|
|
//#endif
|
|
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
float2 TransformTriangleVertexToUV(float2 vertex)
|
|
{
|
|
float2 uv = (vertex + 1.0) * 0.5;
|
|
return uv;
|
|
}
|
|
|
|
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.uvStereo = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
|
|
return o;
|
|
}
|
|
|
|
Varyings Vert_Atlas(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 + float2(-3.0, 1.0)) * (_DeinterleavedAO_TexelSize.zw / _ReinterleavedAO_TexelSize.zw) + 2.0 * _AtlasOffset * _ReinterleavedAO_TexelSize.xy, 0.0, 1.0);
|
|
o.uv = TransformTriangleVertexToUV(input.vertex.xy);
|
|
|
|
// flip triangle upside down
|
|
o.vertex.y = 1 - o.vertex.y;
|
|
|
|
//o.uvStereo = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
|
|
return o;
|
|
}
|
|
|
|
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.uvStereo = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
o.uv = TransformStereoScreenSpaceTex(o.uv, 1.0);
|
|
|
|
//#if STEREO_INSTANCING_ENABLED
|
|
//o.stereoTargetEyeIndex = (uint)_DepthSlice;
|
|
//#endif
|
|
|
|
return o;
|
|
}
|
|
|
|
ENDCG
|
|
|
|
SubShader {
|
|
LOD 100
|
|
ZTest Always Cull Off ZWrite Off
|
|
|
|
// 0
|
|
Pass {
|
|
Name "HBAO - AO"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ DEFERRED_SHADING ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment __ OFFSCREEN_SAMPLES_CONTRIBUTION
|
|
#pragma multi_compile_local_fragment __ NORMALS_CAMERA NORMALS_RECONSTRUCT
|
|
#pragma multi_compile_local_fragment __ INTERLEAVED_GRADIENT_NOISE
|
|
#pragma multi_compile_local_fragment QUALITY_LOWEST QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_HIGHEST
|
|
|
|
#if QUALITY_LOWEST
|
|
#define DIRECTIONS 3
|
|
#define STEPS 2
|
|
#elif QUALITY_LOW
|
|
#define DIRECTIONS 4
|
|
#define STEPS 3
|
|
#elif QUALITY_MEDIUM
|
|
#define DIRECTIONS 6
|
|
#define STEPS 4
|
|
#elif QUALITY_HIGH
|
|
#define DIRECTIONS 8
|
|
#define STEPS 4
|
|
#elif QUALITY_HIGHEST
|
|
#define DIRECTIONS 8
|
|
#define STEPS 6
|
|
#else
|
|
#define DIRECTIONS 1
|
|
#define STEPS 1
|
|
#endif
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment AO_Frag
|
|
|
|
#include "HBAO_AO.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 1
|
|
Pass {
|
|
Name "HBAO - AO Deinterleaved"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ DEFERRED_SHADING ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment __ OFFSCREEN_SAMPLES_CONTRIBUTION
|
|
#pragma multi_compile_local_fragment QUALITY_LOWEST QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_HIGHEST
|
|
|
|
#if QUALITY_LOWEST
|
|
#define DIRECTIONS 3
|
|
#define STEPS 2
|
|
#elif QUALITY_LOW
|
|
#define DIRECTIONS 4
|
|
#define STEPS 3
|
|
#elif QUALITY_MEDIUM
|
|
#define DIRECTIONS 6
|
|
#define STEPS 4
|
|
#elif QUALITY_HIGH
|
|
#define DIRECTIONS 8
|
|
#define STEPS 4
|
|
#elif QUALITY_HIGHEST
|
|
#define DIRECTIONS 8
|
|
#define STEPS 6
|
|
#else
|
|
#define DIRECTIONS 1
|
|
#define STEPS 1
|
|
#endif
|
|
|
|
#define DEINTERLEAVED
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment AO_Frag
|
|
|
|
#include "HBAO_AO.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 2
|
|
Pass {
|
|
Name "HBAO - Deinterleave Depth"
|
|
|
|
CGPROGRAM
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment DeinterleaveDepth_Frag
|
|
|
|
#include "HBAO_Deinterleaving.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 3
|
|
Pass {
|
|
Name "HBAO - Deinterleave Normals"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local_fragment __ NORMALS_CAMERA NORMALS_RECONSTRUCT
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment DeinterleaveNormals_Frag
|
|
|
|
#include "HBAO_Deinterleaving.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 4
|
|
Pass {
|
|
Name "HBAO - Atlas Deinterleaved AO"
|
|
|
|
CGPROGRAM
|
|
#pragma vertex Vert_Atlas
|
|
#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
|
|
}
|
|
|
|
// 5
|
|
Pass {
|
|
Name "HBAO - Reinterleave AO"
|
|
|
|
CGPROGRAM
|
|
#pragma vertex Vert_UVTransform
|
|
#pragma fragment ReinterleaveAO_Frag
|
|
|
|
#include "HBAO_Deinterleaving.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 6
|
|
Pass {
|
|
Name "HBAO - Blur"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment BLUR_RADIUS_2 BLUR_RADIUS_3 BLUR_RADIUS_4 BLUR_RADIUS_5
|
|
|
|
#if BLUR_RADIUS_2
|
|
#define KERNEL_RADIUS 2
|
|
#elif BLUR_RADIUS_3
|
|
#define KERNEL_RADIUS 3
|
|
#elif BLUR_RADIUS_4
|
|
#define KERNEL_RADIUS 4
|
|
#elif BLUR_RADIUS_5
|
|
#define KERNEL_RADIUS 5
|
|
#else
|
|
#define KERNEL_RADIUS 0
|
|
#endif
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment Blur_Frag
|
|
|
|
#include "HBAO_Blur.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 7
|
|
Pass {
|
|
Name "HBAO - Temporal Filter"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment __ VARIANCE_CLIPPING_4TAP VARIANCE_CLIPPING_8TAP
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment TemporalFilter_Frag
|
|
|
|
#include "HBAO_TemporalFilter.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 8
|
|
Pass {
|
|
Name "HBAO - 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
|
|
}
|
|
|
|
// 9
|
|
Pass {
|
|
Name "HBAO - Composite"
|
|
|
|
ColorMask RGB
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment __ MULTIBOUNCE
|
|
#pragma multi_compile_local_fragment __ DEBUG_AO DEBUG_COLORBLEEDING DEBUG_NOAO_AO DEBUG_AO_AOONLY DEBUG_NOAO_AOONLY
|
|
|
|
#pragma vertex Vert_UVTransform
|
|
#pragma fragment Composite_Frag
|
|
|
|
#include "HBAO_Composite.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 10
|
|
Pass {
|
|
Name "HBAO - Composite AfterLighting"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment __ MULTIBOUNCE
|
|
#pragma multi_compile_local_fragment __ LIGHTING_LOG_ENCODED
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment Composite_Frag
|
|
|
|
#include "HBAO_Composite.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 11
|
|
Pass {
|
|
Name "HBAO - Composite BeforeReflections"
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ COLOR_BLEEDING
|
|
#pragma multi_compile_local_fragment __ LIGHTING_LOG_ENCODED
|
|
|
|
#pragma vertex Vert_Default
|
|
#pragma fragment Composite_Lit_Frag
|
|
|
|
#include "HBAO_Composite.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 12
|
|
Pass {
|
|
Name "HBAO - Composite BlendAO"
|
|
|
|
ColorMask RGB
|
|
Blend Zero SrcColor
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ MULTIBOUNCE
|
|
|
|
#pragma vertex Vert_UVTransform
|
|
#pragma fragment Composite_Frag_BlendAO
|
|
|
|
#include "HBAO_Composite.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 13
|
|
Pass {
|
|
Name "HBAO - Composite BlendCB"
|
|
|
|
ColorMask RGB
|
|
Blend One One
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex Vert_UVTransform
|
|
#pragma fragment Composite_Frag_BlendCB
|
|
|
|
#include "HBAO_Composite.cginc"
|
|
ENDCG
|
|
}
|
|
|
|
// 14
|
|
Pass {
|
|
Name "HBAO - Debug ViewNormals"
|
|
|
|
ColorMask RGB
|
|
|
|
CGPROGRAM
|
|
#pragma multi_compile_local_fragment __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local_fragment __ NORMALS_CAMERA NORMALS_RECONSTRUCT
|
|
|
|
#pragma vertex Vert_UVTransform
|
|
#pragma fragment AO_Frag
|
|
|
|
#define DIRECTIONS 1
|
|
#define STEPS 1
|
|
#define DEBUG_VIEWNORMALS
|
|
#include "HBAO_AO.cginc"
|
|
ENDCG
|
|
}
|
|
}
|
|
|
|
FallBack off
|
|
}
|