Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 42 additions & 25 deletions package/Shaders/DeferredCompositeCS.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,12 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il,

float3 finalIrradiance = 0;

float directionalAmbientColorSpecular = Color::RGBToLuminance(Color::Ambient(max(0, SharedData::GetAmbient(R)))) * Color::ReflectionNormalisationScale;
float directionalAmbientColorSpecular =
Color::RGBToLuminance(
Color::IrradianceToLinear(
Color::Ambient(
max(0, SharedData::GetAmbient(R))))) *
Color::ReflectionNormalisationScale;

# if defined(SKYLIGHTING)
# if defined(VR)
Expand All @@ -206,15 +211,19 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il,

# if defined(IBL)
if (SharedData::iblSettings.EnableIBL) {
float3 envSample = EnvTexture.SampleLevel(LinearSampler, R, level);
float3 fullSample = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level);
float3 envSample = Color::IrradianceToLinear(
EnvTexture.SampleLevel(LinearSampler, R, level));
float3 fullSample = Color::IrradianceToLinear(
EnvReflectionsTexture.SampleLevel(LinearSampler, R, level));
float3 envSpecular, skySpecular;

if (SharedData::iblSettings.DALCMode == 2) {
// Mode 2: DALC-normalized env scaled by DALCAmount + sky overlay
float envLum = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15));
envSpecular = Color::IrradianceToLinear((envSample / max(envLum, 0.001)) * directionalAmbientColorSpecular) * SharedData::iblSettings.DALCAmount;
skySpecular = Color::IrradianceToLinear(max(0, fullSample - envSample)) * SharedData::iblSettings.SkyIBLScale;
float envLum = Color::RGBToLuminance(
Color::IrradianceToLinear(
EnvTexture.SampleLevel(LinearSampler, R, 15)));
envSpecular = envSample / max(envLum, 0.001) * directionalAmbientColorSpecular * SharedData::iblSettings.DALCAmount;
skySpecular = max(0, fullSample - envSample) * SharedData::iblSettings.SkyIBLScale;
# if defined(SKYLIGHTING)
skySpecular *= skylightingSpecular;
# elif defined(INTERIOR)
Expand All @@ -223,8 +232,8 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il,
} else {
// Mode 0/1: IBL ratio-based
float3 ratio = ImageBasedLighting::GetIBLRatio();
envSpecular = Color::IrradianceToLinear(envSample * ratio) * SharedData::iblSettings.EnvIBLScale;
skySpecular = Color::IrradianceToLinear(max(0, fullSample - envSample)) * SharedData::iblSettings.SkyIBLScale;
envSpecular = envSample * ratio * SharedData::iblSettings.EnvIBLScale;
skySpecular = max(0, fullSample - envSample) * SharedData::iblSettings.SkyIBLScale;
# if defined(SKYLIGHTING)
skySpecular *= skylightingSpecular;
# elif defined(INTERIOR)
Expand All @@ -238,32 +247,40 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, inout float ao, out float3 il,
{
// Fallback without IBL: normalize-by-luminance with DALC
# if defined(INTERIOR)
float3 specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level);
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15));
specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
finalIrradiance = Color::IrradianceToLinear(specularIrradiance);
float3 specularIrradiance = Color::IrradianceToLinear(
EnvTexture.SampleLevel(LinearSampler, R, level));
float specularIrradianceLuminance = Color::RGBToLuminance(
Color::IrradianceToLinear(
EnvTexture.SampleLevel(LinearSampler, R, 15)));
finalIrradiance = specularIrradiance / max(specularIrradianceLuminance, 0.001) * directionalAmbientColorSpecular;
# elif defined(SKYLIGHTING)
float3 specularIrradianceReflections = 0.0;
if (skylightingSpecular > 0.0) {
specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level);
float lum = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15));
specularIrradianceReflections = (specularIrradianceReflections / max(lum, 0.001)) * directionalAmbientColorSpecular;
specularIrradianceReflections = Color::IrradianceToLinear(specularIrradianceReflections);
specularIrradianceReflections = Color::IrradianceToLinear(
EnvReflectionsTexture.SampleLevel(LinearSampler, R, level));
float lum = Color::RGBToLuminance(
Color::IrradianceToLinear(
EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)));
specularIrradianceReflections = specularIrradianceReflections / max(lum, 0.001) * directionalAmbientColorSpecular;
}
float3 specularIrradiance = 0.0;
if (skylightingSpecular < 1.0) {
specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level);
float lum = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15));
float dalcScaled = Color::IrradianceToGamma(Color::IrradianceToLinear(directionalAmbientColorSpecular) * skylightingSpecular);
specularIrradiance = (specularIrradiance / max(lum, 0.001)) * dalcScaled;
specularIrradiance = Color::IrradianceToLinear(specularIrradiance);
specularIrradiance = Color::IrradianceToLinear(
EnvTexture.SampleLevel(LinearSampler, R, level));
float lum = Color::RGBToLuminance(
Color::IrradianceToLinear(
EnvTexture.SampleLevel(LinearSampler, R, 15)));
float dalcScaled = directionalAmbientColorSpecular * skylightingSpecular;
specularIrradiance = specularIrradiance / max(lum, 0.001) * dalcScaled;
}
finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular);
# else
float3 specularIrradiance = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level);
float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15));
specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
finalIrradiance = Color::IrradianceToLinear(specularIrradiance);
float3 specularIrradiance = Color::IrradianceToLinear(
EnvReflectionsTexture.SampleLevel(LinearSampler, R, level));
float specularIrradianceLuminance = Color::RGBToLuminance(
Color::IrradianceToLinear(
EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)));
finalIrradiance = specularIrradiance / max(specularIrradianceLuminance, 0.001) * directionalAmbientColorSpecular;
# endif
}

Expand Down
Loading