194 lines
8.0 KiB
Plaintext
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
|
|
}
|