Skip to content

Commit

Permalink
Added ZH3 "hallucination" mode for calculating irradiance from L1 SH
Browse files Browse the repository at this point in the history
  • Loading branch information
TheRealMJP committed May 10, 2024
1 parent 0131b90 commit 0d6f4ce
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 2 deletions.
5 changes: 3 additions & 2 deletions BakingLab/AppSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,11 @@ static const char* SGSpecularModesLabels[3] =
"ASG Warp",
};

static const char* SH4DiffuseModesLabels[2] =
static const char* SH4DiffuseModesLabels[3] =
{
"Convolution",
"Geomerics",
"ZH3",
};

static const char* SHSpecularModesLabels[4] =
Expand Down Expand Up @@ -507,7 +508,7 @@ namespace AppSettings
SGSpecularMode.Initialize(tweakBar, "SGSpecularMode", "SG Settings", "Use ASG Warp", "", SGSpecularModes::ASGWarp, 3, SGSpecularModesLabels);
Settings.AddSetting(&SGSpecularMode);

SH4DiffuseMode.Initialize(tweakBar, "SH4DiffuseMode", "SH Settings", "L1 SH Diffuse Mode", "", SH4DiffuseModes::Convolution, 2, SH4DiffuseModesLabels);
SH4DiffuseMode.Initialize(tweakBar, "SH4DiffuseMode", "SH Settings", "L1 SH Diffuse Mode", "", SH4DiffuseModes::Convolution, 3, SH4DiffuseModesLabels);
Settings.AddSetting(&SH4DiffuseMode);

SHSpecularMode.Initialize(tweakBar, "SHSpecularMode", "SH Settings", "SH Specular Mode", "", SHSpecularModes::Convolution, 4, SHSpecularModesLabels);
Expand Down
1 change: 1 addition & 0 deletions BakingLab/AppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ enum SH4DiffuseModes
{
Convolution = 0,
Geomerics,
ZH3,
}

enum SHSpecularModes
Expand Down
1 change: 1 addition & 0 deletions BakingLab/AppSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ enum class SH4DiffuseModes
{
Convolution = 0,
Geomerics = 1,
ZH3 = 2,

NumValues
};
Expand Down
1 change: 1 addition & 0 deletions BakingLab/AppSettings.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ static const int SGSpecularModes_ASGWarp = 2;

static const int SH4DiffuseModes_Convolution = 0;
static const int SH4DiffuseModes_Geomerics = 1;
static const int SH4DiffuseModes_ZH3 = 2;

static const int SHSpecularModes_Convolution = 0;
static const int SHSpecularModes_DominantDirection = 1;
Expand Down
2 changes: 2 additions & 0 deletions BakingLab/Mesh.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,8 @@ PSOutput PS(in PSInput input)

if(SH4DiffuseMode == SH4DiffuseModes_Geomerics)
indirectIrradiance = EvalSH4IrradianceGeomerics(normalSHSG, shRadiance);
else if(SH4DiffuseMode == SH4DiffuseModes_ZH3)
indirectIrradiance = EvalSH4IrradianceZH3Hallucinate(normalSHSG, shRadiance);
else
indirectIrradiance = EvalSH4Irradiance(normalSHSG, shRadiance);

Expand Down
21 changes: 21 additions & 0 deletions SampleFramework11/v1.02/Shaders/SH.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,27 @@ float3 EvalSH4IrradianceGeomerics(in float3 dir, in SH4Color sh)
EvalSH4IrradianceGeomerics(dir, shb));
}

//-------------------------------------------------------------------------------------------------
// From "ZH3: Quadratic Zonal Harmonics" - https://torust.me/ZH3.pdf
//-------------------------------------------------------------------------------------------------
float3 EvalSH4IrradianceZH3Hallucinate(in float3 dir, in SH4Color sh)
{
const float3 lumCoefficients = float3(0.2126f, 0.7152f, 0.0722f);
const float3 zonalAxis = normalize(float3(-dot(sh.c[3], lumCoefficients), -dot(sh.c[1], lumCoefficients), dot(sh.c[2], lumCoefficients)));

const float3 ratio = float3(abs(dot(float3(-sh.c[3].r, -sh.c[1].r, sh.c[2].r), zonalAxis)),
abs(dot(float3(-sh.c[3].g, -sh.c[1].g, sh.c[2].g), zonalAxis)),
abs(dot(float3(-sh.c[3].b, -sh.c[1].b, sh.c[2].b), zonalAxis))) / sh.c[0];
const float3 zonalL2Coeff = sh.c[0] * (0.08f * ratio + 0.6f * ratio * ratio);

const float fZ = dot(zonalAxis, dir);
const float zhDir = sqrt(5.0f / (16.0f * Pi)) * (3.0f * fZ * fZ - 1.0f);

const float3 baseIrradiance = EvalSH4Irradiance(dir, sh);

return baseIrradiance + (0.25f * zonalL2Coeff * zhDir);
}

//-------------------------------------------------------------------------------------------------
// Converts from 3-band to 2-band SH
//-------------------------------------------------------------------------------------------------
Expand Down

0 comments on commit 0d6f4ce

Please sign in to comment.