2021-09-09 20:42:29 -04:00

194 lines
8.0 KiB
Plaintext

Shader "Hidden/ScriptableRenderPipeline/DebugDisplayProbeVolume"
{
HLSLINCLUDE
#pragma target 4.5
#pragma only_renderers d3d11 playstation xboxone vulkan metal switch
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"
#if SHADEROPTIONS_ENABLE_PROBE_VOLUMES == 1
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/ProbeVolumeShaderVariables.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/ProbeVolume/ProbeVolumeAtlas.hlsl"
#endif
#define DEBUG_DISPLAY
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl"
float3 _TextureViewScale;
float3 _TextureViewBias;
float3 _TextureViewResolution;
float2 _ValidRange;
int _ProbeVolumeAtlasSliceMode;
// float _RcpGlobalScaleFactor;
SamplerState ltc_linear_clamp_sampler;
struct Attributes
{
uint vertexID : VERTEXID_SEMANTIC;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 texcoord : TEXCOORD0;
};
Varyings Vert(Attributes input)
{
Varyings output;
output.positionCS = GetFullScreenTriangleVertexPosition(input.vertexID);
output.texcoord = GetFullScreenTriangleTexCoord(input.vertexID);
return output;
}
ENDHLSL
SubShader
{
Pass
{
Name "ProbeVolume"
ZTest Off
Blend One Zero
Cull Off
ZWrite On
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment Frag
float4 Frag(Varyings input) : SV_Target
{
#if SHADEROPTIONS_ENABLE_PROBE_VOLUMES == 1
// Layout Z slices horizontally in debug view UV space.
float3 uvw;
uvw.z = input.texcoord.x * _TextureViewResolution.z;
uvw.x = frac(uvw.z);
uvw.z = (floor(uvw.z) + 0.5f) / _TextureViewResolution.z;
uvw.y = input.texcoord.y;
// uvw is now in [0, 1] space.
// Convert to specific view section of atlas.
uvw = uvw * _TextureViewScale + _TextureViewBias;
#if SHADEROPTIONS_PROBE_VOLUMES_ENCODING_MODE == PROBEVOLUMESENCODINGMODES_SPHERICAL_HARMONICS_L1
ProbeVolumeSphericalHarmonicsL1 coefficients;
ZERO_INITIALIZE(ProbeVolumeSphericalHarmonicsL1, coefficients);
ProbeVolumeSampleAccumulateSphericalHarmonicsL1(uvw, 1.0f, coefficients);
ProbeVolumeSwizzleAndNormalizeSphericalHarmonicsL1(coefficients);
float4 valueShAr = saturate((coefficients.data[0] - _ValidRange.x) * _ValidRange.y);
float4 valueShAg = saturate((coefficients.data[1] - _ValidRange.x) * _ValidRange.y);
float4 valueShAb = saturate((coefficients.data[2] - _ValidRange.x) * _ValidRange.y);
float4 valueShBr = 0.0f;
float4 valueShBg = 0.0f;
float4 valueShBb = 0.0f;
float4 valueShC = 0.0f;
#elif SHADEROPTIONS_PROBE_VOLUMES_ENCODING_MODE == PROBEVOLUMESENCODINGMODES_SPHERICAL_HARMONICS_L2
ProbeVolumeSphericalHarmonicsL2 coefficients;
ZERO_INITIALIZE(ProbeVolumeSphericalHarmonicsL2, coefficients);
ProbeVolumeSampleAccumulateSphericalHarmonicsL2(uvw, 1.0f, coefficients);
ProbeVolumeSwizzleAndNormalizeSphericalHarmonicsL2(coefficients);
float4 valueShAr = saturate((coefficients.data[0] - _ValidRange.x) * _ValidRange.y);
float4 valueShAg = saturate((coefficients.data[1] - _ValidRange.x) * _ValidRange.y);
float4 valueShAb = saturate((coefficients.data[2] - _ValidRange.x) * _ValidRange.y);
float4 valueShBr = saturate((coefficients.data[3] - _ValidRange.x) * _ValidRange.y);
float4 valueShBg = saturate((coefficients.data[4] - _ValidRange.x) * _ValidRange.y);
float4 valueShBb = saturate((coefficients.data[5] - _ValidRange.x) * _ValidRange.y);
float4 valueShC = saturate((coefficients.data[6] - _ValidRange.x) * _ValidRange.y);
#endif
float valueValidity = saturate((ProbeVolumeSampleValidity(uvw) - _ValidRange.x) * _ValidRange.y);
#if SHADEROPTIONS_PROBE_VOLUMES_BILATERAL_FILTERING == PROBEVOLUMESBILATERALFILTERINGMODES_OCTAHEDRAL_DEPTH
float2 valueOctahedralDepthMeanAndVariance = saturate((SAMPLE_TEXTURE2D_LOD(_AtlasTextureOctahedralDepth, ltc_linear_clamp_sampler, input.texcoord * _AtlasTextureOctahedralDepthScaleBias.xy + _AtlasTextureOctahedralDepthScaleBias.zw, 0).xy - _ValidRange.x) * _ValidRange.y);
#endif
switch (_ProbeVolumeAtlasSliceMode)
{
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH00:
{
return float4(valueShAr.w, valueShAg.w, valueShAb.w, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH1_1:
{
return float4(valueShAr.x, valueShAg.x, valueShAb.x, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH10:
{
return float4(valueShAr.y, valueShAg.y, valueShAb.y, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH11:
{
return float4(valueShAr.z, valueShAg.z, valueShAb.z, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH2_2:
{
return float4(valueShBr.x, valueShBg.x, valueShBb.x, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH2_1:
{
return float4(valueShBr.y, valueShBg.y, valueShBb.y, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH20:
{
return float4(valueShBr.z, valueShBg.z, valueShBb.z, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH21:
{
return float4(valueShBr.w, valueShBg.w, valueShBb.w, 1);
}
case PROBEVOLUMEATLASSLICEMODE_IRRADIANCE_SH22:
{
return float4(valueShC.x, valueShC.y, valueShC.z, 1);
}
case PROBEVOLUMEATLASSLICEMODE_VALIDITY:
{
return float4(lerp(float3(1, 0, 0), float3(0, 1, 0), valueValidity), 1);
}
case PROBEVOLUMEATLASSLICEMODE_OCTAHEDRAL_DEPTH:
{
#if SHADEROPTIONS_PROBE_VOLUMES_BILATERAL_FILTERING == PROBEVOLUMESBILATERALFILTERINGMODES_OCTAHEDRAL_DEPTH
// Tonemap variance with sqrt() to bring it into a more similar scale to mean to make it more readable.
return float4(
valueOctahedralDepthMeanAndVariance.x,
(valueOctahedralDepthMeanAndVariance.y > 0.0f) ? sqrt(valueOctahedralDepthMeanAndVariance.y) : 0.0f,
0.0f,
1.0f
);
#else
return float4(0.0f, 0.0f, 0.0f, 1.0f);
#endif
}
default: return float4(0.0, 0.0, 0.0, 1.0);
}
#else
return float4(0.0, 0.0, 0.0, 1.0);
#endif
}
ENDHLSL
}
}
Fallback Off
}