Skip to content
Merged
Show file tree
Hide file tree
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
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

namespace DynamicCubemaps
{
TextureCube<float4> EnvReflectionsTexture : register(t30);
TextureCube<float4> EnvTexture : register(t31);
TextureCube<float3> EnvReflectionsTexture : register(t30);
TextureCube<float3> EnvTexture : register(t31);
Comment thread
doodlum marked this conversation as resolved.

#if !defined(WATER)

Expand All @@ -22,9 +22,6 @@ namespace DynamicCubemaps
# endif
{
float3 R = reflect(-V, N);
float NoV = saturate(dot(N, V));

float level = roughness * 7.0;

// Horizon specular occlusion
// https://marmosetco.tumblr.com/post/81245981087
Expand All @@ -35,68 +32,81 @@ namespace DynamicCubemaps
return horizon;
# else

float NoV = saturate(dot(N, V));

float level = roughness * 7.0;

float3 finalIrradiance = 0;

float directionalAmbientColorSpecular = Color::RGBToLuminance(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0))) * Color::ReflectionNormalisationScale);
float directionalAmbientColorSpecular = Color::RGBToLuminance(
max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0)))
) * Color::ReflectionNormalisationScale;

# if defined(IBL) && defined(LIGHTING)
const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld);
const bool inReflection = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InReflection);
if (SharedData::iblSettings.EnableDiffuseIBL && SharedData::iblSettings.UseStaticIBL && !inWorld && !inReflection) {
float3 specularIrradiance = ImageBasedLighting::StaticSpecularIBLTexture.SampleLevel(SampColorSampler, R.xzy, level).xyz;
finalIrradiance += specularIrradiance;
finalIrradiance = specularIrradiance;
return finalIrradiance;
}
# endif

# if defined(SKYLIGHTING)
if (SharedData::InInterior) {
float3 specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz);
float3 specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level).xyz;

float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, 15).xyz));
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradiance = Color::GammaToLinear(specularIrradiance);

finalIrradiance += specularIrradiance;
finalIrradiance = specularIrradiance;
return finalIrradiance;
}

sh2 specularLobe = SphericalHarmonics::FauxSpecularLobe(N, -V, roughness);

float skylightingSpecular = SphericalHarmonics::FuncProductIntegral(skylighting, specularLobe);
skylightingSpecular = saturate(skylightingSpecular);
skylightingSpecular = Skylighting::mixSpecular(SharedData::skylightingSettings, skylightingSpecular);

directionalAmbientColorSpecular *= skylightingSpecular;

float3 specularIrradiance = 1;
float3 specularIrradianceReflections = 0.0;

if (skylightingSpecular < 1.0){
specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz);
if (skylightingSpecular > 0.0){
specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level);

float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, 15).xyz));
float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradianceReflections = Color::GammaToLinear(specularIrradianceReflections);
}

float3 specularIrradianceReflections = 1.0;
float3 specularIrradiance = 0.0;

if (skylightingSpecular > 0.0){
specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level).xyz);
if (skylightingSpecular < 1.0){
specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level);

float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15).xyz));
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular;
directionalAmbientColorSpecular = Color::GammaToLinear(directionalAmbientColorSpecular);
directionalAmbientColorSpecular *= skylightingSpecular;
directionalAmbientColorSpecular = Color::LinearToGamma(directionalAmbientColorSpecular);

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradiance = Color::GammaToLinear(specularIrradiance);
}

finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular);
# else
float3 specularIrradiance = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level).xyz);
float3 specularIrradiance = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level);

float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, 15).xyz));
float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradiance = Color::GammaToLinear(specularIrradiance);

finalIrradiance += specularIrradiance;
finalIrradiance = specularIrradiance;
# endif
Comment thread
coderabbitai[bot] marked this conversation as resolved.
return finalIrradiance;
# endif
Expand Down Expand Up @@ -125,6 +135,7 @@ namespace DynamicCubemaps
# else

float3 finalIrradiance = 0;
float directionalAmbientColorSpecular = Color::RGBToLuminance(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0)))) * Color::ReflectionNormalisationScale;

# if defined(IBL) && defined(LIGHTING)
const bool inWorld = (Permutation::ExtraShaderDescriptor & Permutation::ExtraFlags::InWorld);
Expand All @@ -138,33 +149,57 @@ namespace DynamicCubemaps

# if defined(SKYLIGHTING)
if (SharedData::InInterior) {
float3 specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz);
float3 specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level).xyz;

finalIrradiance += specularIrradiance;
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradiance = Color::GammaToLinear(specularIrradiance);

finalIrradiance = specularIrradiance;
return horizon * (F0 * specularBRDF.x + specularBRDF.y) * finalIrradiance;
}

sh2 specularLobe = SphericalHarmonics::FauxSpecularLobe(N, -V, roughness);

float skylightingSpecular = SphericalHarmonics::FuncProductIntegral(skylighting, specularLobe);
skylightingSpecular = saturate(skylightingSpecular);
skylightingSpecular = Skylighting::mixSpecular(SharedData::skylightingSettings, skylightingSpecular);

float3 specularIrradiance = 1;
directionalAmbientColorSpecular *= skylightingSpecular;

float3 specularIrradiance = 1.0;

if (skylightingSpecular < 1.0){
specularIrradiance = EnvTexture.SampleLevel(SampColorSampler, R, level);

if (skylightingSpecular < 1.0)
specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(SampColorSampler, R, level).xyz);
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradiance = Color::GammaToLinear(specularIrradiance);
}

float3 specularIrradianceReflections = 1.0;

if (skylightingSpecular > 0.0)
specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level).xyz);
if (skylightingSpecular > 0.0){
specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level);

float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradianceReflections = Color::GammaToLinear(specularIrradianceReflections);
}

finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular);
# else
Comment thread
coderabbitai[bot] marked this conversation as resolved.
float3 specularIrradiance = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level));
float3 specularIrradiance = EnvReflectionsTexture.SampleLevel(SampColorSampler, R, level);

float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(SampColorSampler, R, 15));

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
specularIrradiance = Color::GammaToLinear(specularIrradiance);

finalIrradiance += specularIrradiance;
finalIrradiance = specularIrradiance;
# endif
Comment thread
doodlum marked this conversation as resolved.
return horizon * (F0 * specularBRDF.x + specularBRDF.y) * finalIrradiance;
# endif
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[Info]
Version = 2-2-1
Version = 2-2-2
14 changes: 12 additions & 2 deletions package/Shaders/Common/Color.hlsli
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,20 @@ namespace Color
}

// Attempt to match vanilla materials that are darker than PBR
const static float PBRLightingScale = 0.666;
const static float PBRLightingScale = 0.65;

// Attempt to normalise reflection brightness against DALC
const static float ReflectionNormalisationScale = 0.666;
const static float ReflectionNormalisationScale = 0.65;

float GammaToLinear(float color)
{
return pow(abs(color), 1.6);
}

float LinearToGamma(float color)
{
return pow(abs(color), 1.0 / 1.6);
}

float3 GammaToLinear(float3 color)
{
Expand Down
55 changes: 31 additions & 24 deletions package/Shaders/DeferredCompositeCS.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -188,27 +188,25 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, out float ao, out float3 il, i

float3 finalIrradiance = 0;

float directionalAmbientColorSpecular = Color::RGBToLuminance(
Color::GammaToLinear(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0))))
* Color::ReflectionNormalisationScale
);
float directionalAmbientColorSpecular = Color::RGBToLuminance(max(0, mul(SharedData::DirectionalAmbient, float4(R, 1.0)))) * Color::ReflectionNormalisationScale;

# if defined(INTERIOR)
float3 specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, level));
float3 specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level);

float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, 15)));
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15));

# if defined(IBL)
float3 iblColor = 0;
if (SharedData::iblSettings.EnableDiffuseIBL && SharedData::iblSettings.EnableInterior) {
directionalAmbientColorSpecular *= SharedData::iblSettings.DALCAmount;
iblColor += Color::Saturation(ImageBasedLighting::GetIBLColor(-R), SharedData::iblSettings.IBLSaturation) * SharedData::iblSettings.DiffuseIBLScale;
float iblColorLuminance = Color::RGBToLuminance(iblColor);
float iblColorLuminance = Color::RGBToLuminance(Color::LinearToGamma(iblColor));
directionalAmbientColorSpecular += iblColorLuminance;
}
# endif
specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;

finalIrradiance += specularIrradiance;
finalIrradiance = Color::GammaToLinear(specularIrradiance);
# elif defined(SKYLIGHTING)
# if defined(VR)
float3 positionMS = positionWS.xyz + FrameBuffer::CameraPosAdjust[eyeIndex].xyz - FrameBuffer::CameraPosAdjust[0].xyz;
Expand All @@ -219,37 +217,46 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, out float ao, out float3 il, i
sh2 skylighting = Skylighting::sample(SharedData::skylightingSettings, SkylightingProbeArray, stbn_vec3_2Dx1D_128x128x64, dispatchID.xy, positionMS.xyz, R);

float skylightingSpecular = SphericalHarmonics::FuncProductIntegral(skylighting, specularLobe);
skylightingSpecular = saturate(skylightingSpecular);
skylightingSpecular = Skylighting::mixSpecular(SharedData::skylightingSettings, skylightingSpecular);

directionalAmbientColorSpecular *= skylightingSpecular;
# if defined(IBL)
float3 iblColor = 0;
if (SharedData::iblSettings.EnableDiffuseIBL) {
directionalAmbientColorSpecular *= SharedData::iblSettings.DALCAmount;
iblColor += Color::Saturation(ImageBasedLighting::GetIBLColor(-R, skylightingSpecular), SharedData::iblSettings.IBLSaturation) * SharedData::iblSettings.DiffuseIBLScale;
float iblColorLuminance = Color::RGBToLuminance(iblColor);
float iblColorLuminance = Color::RGBToLuminance(Color::LinearToGamma(iblColor));
directionalAmbientColorSpecular += iblColorLuminance;
}
# endif

float3 specularIrradiance = 1;
float3 specularIrradianceReflections = 0.0;

if (skylightingSpecular < 1.0){
specularIrradiance = Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, level));
if (skylightingSpecular > 0.0){
specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level);

float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvTexture.SampleLevel(LinearSampler, R, 15)));
float specularIrradianceLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15));

specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;

specularIrradianceReflections = Color::GammaToLinear(specularIrradianceReflections);

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
}

float3 specularIrradianceReflections = 1.0;
float3 specularIrradiance = 0.0;

if (skylightingSpecular > 0.0){
specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, level));
if (skylightingSpecular < 1.0){
specularIrradiance = EnvTexture.SampleLevel(LinearSampler, R, level);

float specularIrradianceLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)));
float specularIrradianceLuminance = Color::RGBToLuminance(EnvTexture.SampleLevel(LinearSampler, R, 15));

specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;
directionalAmbientColorSpecular = Color::GammaToLinear(directionalAmbientColorSpecular);
directionalAmbientColorSpecular *= skylightingSpecular;
directionalAmbientColorSpecular = Color::LinearToGamma(directionalAmbientColorSpecular);

specularIrradiance = (specularIrradiance / max(specularIrradianceLuminance, 0.001)) * directionalAmbientColorSpecular;

specularIrradiance = Color::GammaToLinear(specularIrradiance);
}

finalIrradiance = lerp(specularIrradiance, specularIrradianceReflections, skylightingSpecular);
Expand All @@ -259,17 +266,17 @@ void SampleSSGISpecular(uint2 pixCoord, sh2 lobe, out float ao, out float3 il, i
if (SharedData::iblSettings.EnableDiffuseIBL) {
directionalAmbientColorSpecular *= SharedData::iblSettings.DALCAmount;
iblColor += Color::Saturation(ImageBasedLighting::GetIBLColor(-R), SharedData::iblSettings.IBLSaturation) * SharedData::iblSettings.DiffuseIBLScale;
float iblColorLuminance = Color::RGBToLuminance(iblColor);
float iblColorLuminance = Color::RGBToLuminance(Color::LinearToGamma(iblColor));
directionalAmbientColorSpecular += iblColorLuminance;
}
# endif
float3 specularIrradianceReflections = Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, level));
float3 specularIrradianceReflections = EnvReflectionsTexture.SampleLevel(LinearSampler, R, level);

float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(Color::GammaToLinear(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15)));
float specularIrradianceReflectionsLuminance = Color::RGBToLuminance(EnvReflectionsTexture.SampleLevel(LinearSampler, R, 15));

specularIrradianceReflections = (specularIrradianceReflections / max(specularIrradianceReflectionsLuminance, 0.001)) * directionalAmbientColorSpecular;

finalIrradiance += specularIrradianceReflections;
finalIrradiance = Color::GammaToLinear(specularIrradianceReflections);
# endif

# if defined(SSGI)
Expand Down