371 lines
11 KiB
Plaintext
371 lines
11 KiB
Plaintext
Shader "Hidden/Universal Render Pipeline/HBAO"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex("", any) = "" {}
|
|
_HBAOTex("", any) = "" {}
|
|
_TempTex("", any) = "" {}
|
|
_NoiseTex("", 2D) = "" {}
|
|
_DepthTex("", any) = "" {}
|
|
_NormalsTex("", any) = "" {}
|
|
}
|
|
|
|
HLSLINCLUDE
|
|
|
|
#pragma target 3.0
|
|
#pragma prefer_hlslcc gles
|
|
#pragma exclude_renderers d3d11_9x
|
|
#pragma editor_sync_compilation
|
|
//#pragma enable_d3d11_debug_symbols
|
|
|
|
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
TEXTURE2D_X(_MainTex);
|
|
TEXTURE2D_X(_HBAOTex);
|
|
TEXTURE2D_X(_TempTex);
|
|
TEXTURE2D_X(_DepthTex);
|
|
TEXTURE2D_X(_NormalsTex);
|
|
//TEXTURE2D_X(_CameraNormalsTexture);
|
|
TEXTURE2D_X(_MotionVectorTexture);
|
|
TEXTURE2D(_NoiseTex);
|
|
// SAMPLER(sampler_PointRepeat);
|
|
// SAMPLER(sampler_PointClamp);
|
|
|
|
float4 _HistoryBuffer_RTHandleScale;
|
|
|
|
CBUFFER_START(FrequentlyUpdatedUniforms)
|
|
float4 _Input_TexelSize;
|
|
float4 _AO_TexelSize;
|
|
float4 _DeinterleavedAO_TexelSize;
|
|
float4 _ReinterleavedAO_TexelSize;
|
|
float4 _TargetScale;
|
|
float4 _UVToView;
|
|
float4x4 _WorldToCameraMatrix;
|
|
float _Radius;
|
|
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 _ColorBleedBrightnessMask;
|
|
float2 _ColorBleedBrightnessMaskRange;
|
|
float2 _TemporalParams;
|
|
CBUFFER_END
|
|
|
|
CBUFFER_START(PerPassUpdatedUniforms)
|
|
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
|
|
{
|
|
float4 positionOS : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float4 positionCS : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
Varyings Vert(Attributes input)
|
|
{
|
|
Varyings output;
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
//output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
|
|
// Note: The pass is setup with a mesh already in CS
|
|
// Therefore, we can just output vertex position
|
|
output.positionCS = float4(input.positionOS.xyz, 1.0);
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
output.positionCS.y *= -1;
|
|
#endif
|
|
output.uv = input.uv;
|
|
return output;
|
|
}
|
|
|
|
Varyings Vert_Atlas(Attributes input)
|
|
{
|
|
Varyings output;
|
|
UNITY_SETUP_INSTANCE_ID(input);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
//float3 pos = input.positionOS.xyz;
|
|
//pos.xy = pos.xy * (_DeinterleavedAO_TexelSize.zw / _ReinterleavedAO_TexelSize.zw) + _AtlasOffset * _ReinterleavedAO_TexelSize.xy;
|
|
//output.positionCS = TransformObjectToHClip(pos);
|
|
output.positionCS = float4((input.positionOS.xy + float2(-3.0, 1.0)) * (_DeinterleavedAO_TexelSize.zw / _ReinterleavedAO_TexelSize.zw) + 2.0 * _AtlasOffset * _ReinterleavedAO_TexelSize.xy, 0.0, 1.0);
|
|
// flip triangle upside down
|
|
output.positionCS.y = 1 - output.positionCS.y;
|
|
output.uv = input.uv;
|
|
return output;
|
|
}
|
|
|
|
ENDHLSL
|
|
|
|
SubShader
|
|
{
|
|
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
|
|
LOD 100
|
|
ZWrite Off ZTest Always Blend Off Cull Off
|
|
|
|
Pass // 0
|
|
{
|
|
Name "HBAO - AO"
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local __ COLOR_BLEEDING
|
|
#pragma multi_compile_local __ OFFSCREEN_SAMPLES_CONTRIBUTION
|
|
#pragma multi_compile_local __ NORMALS_RECONSTRUCT2 NORMALS_RECONSTRUCT4
|
|
#pragma multi_compile_local __ INTERLEAVED_GRADIENT_NOISE
|
|
#pragma multi_compile_local QUALITY_LOWEST QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_HIGHEST
|
|
#pragma multi_compile_fragment __ _GBUFFER_NORMALS_OCT // support octahedron endoded normals
|
|
|
|
#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
|
|
#pragma fragment AO_Frag
|
|
|
|
#include "HBAO_AO.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass // 1
|
|
{
|
|
Name "HBAO - AO Deinterleaved"
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local __ COLOR_BLEEDING
|
|
#pragma multi_compile_local __ OFFSCREEN_SAMPLES_CONTRIBUTION
|
|
#pragma multi_compile_local 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
|
|
#pragma fragment AO_Frag
|
|
|
|
#include "HBAO_AO.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
// 2
|
|
Pass {
|
|
Name "HBAO - Deinterleave Depth"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex Vert
|
|
#pragma fragment DeinterleaveDepth_Frag
|
|
|
|
#include "HBAO_Deinterleaving.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
// 3
|
|
Pass {
|
|
Name "HBAO - Deinterleave Normals"
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local __ NORMALS_RECONSTRUCT2 NORMALS_RECONSTRUCT4
|
|
#pragma multi_compile_fragment __ _GBUFFER_NORMALS_OCT // support octahedron endoded normals
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment DeinterleaveNormals_Frag
|
|
|
|
#include "HBAO_Deinterleaving.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
// 4
|
|
Pass {
|
|
Name "HBAO - Atlas Deinterleaved AO"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex Vert_Atlas
|
|
#pragma fragment Frag
|
|
|
|
half4 Frag(Varyings input) : SV_Target
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
|
|
float2 uv = UnityStereoTransformScreenSpaceTex(input.uv);
|
|
return SAMPLE_TEXTURE2D_X(_MainTex, sampler_PointClamp, uv);
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
// 5
|
|
Pass {
|
|
Name "HBAO - Reinterleave AO"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex Vert
|
|
#pragma fragment ReinterleaveAO_Frag
|
|
|
|
#include "HBAO_Deinterleaving.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass // 6
|
|
{
|
|
Name "HBAO - Blur"
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local __ COLOR_BLEEDING
|
|
#pragma multi_compile_local 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
|
|
#pragma fragment Blur_Frag
|
|
|
|
#include "HBAO_Blur.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass // 7
|
|
{
|
|
Name "HBAO - Temporal Filter"
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ COLOR_BLEEDING
|
|
#pragma multi_compile_local __ VARIANCE_CLIPPING_4TAP VARIANCE_CLIPPING_8TAP
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment TemporalFilter_Frag
|
|
|
|
#include "HBAO_TemporalFilter.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass // 8
|
|
{
|
|
Name "HBAO - Copy"
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex Vert
|
|
#pragma fragment Frag
|
|
|
|
half4 Frag(Varyings input) : SV_Target
|
|
{
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
|
|
float2 uv = UnityStereoTransformScreenSpaceTex(input.uv);
|
|
return SAMPLE_TEXTURE2D_X(_MainTex, sampler_PointClamp, uv);
|
|
}
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass // 9
|
|
{
|
|
Name "HBAO - Composite"
|
|
|
|
ColorMask RGB
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ LIT_AO
|
|
#pragma multi_compile_local __ COLOR_BLEEDING
|
|
#pragma multi_compile_local __ MULTIBOUNCE
|
|
#pragma multi_compile_local __ DEBUG_AO DEBUG_COLORBLEEDING DEBUG_NOAO_AO DEBUG_AO_AOONLY DEBUG_NOAO_AOONLY
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment Composite_Frag
|
|
|
|
#include "HBAO_Composite.hlsl"
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass // 10
|
|
{
|
|
Name "HBAO - Debug ViewNormals"
|
|
|
|
ColorMask RGB
|
|
|
|
HLSLPROGRAM
|
|
#pragma multi_compile_local __ ORTHOGRAPHIC_PROJECTION
|
|
#pragma multi_compile_local __ NORMALS_RECONSTRUCT2 NORMALS_RECONSTRUCT4
|
|
#pragma multi_compile_fragment __ _GBUFFER_NORMALS_OCT // support octahedron endoded normals
|
|
|
|
#pragma vertex Vert
|
|
#pragma fragment AO_Frag
|
|
|
|
#define DIRECTIONS 1
|
|
#define STEPS 1
|
|
#define DEBUG_VIEWNORMALS
|
|
|
|
#include "HBAO_AO.hlsl"
|
|
ENDHLSL
|
|
}
|
|
}
|
|
|
|
Fallback Off
|
|
}
|