Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refined the number of samples used in diffused and specular textures #6613

Merged
merged 5 commits into from
Dec 22, 2023
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
16 changes: 12 additions & 4 deletions src/webgl/shaders/imageLightDiffused.frag
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ vec2 nTOE( vec3 v ){
return angles;
}

float random(vec2 p) {
vec3 p3 = fract(vec3(p.xyx) * .1031);
p3 += dot(p3, p3.yzx + 33.33);
return fract((p3.x + p3.y) * p3.z);
}

void main()
{
// the sample direction equals the hemisphere's orientation
Expand All @@ -48,13 +54,15 @@ void main()
// We specify a fixed sampleDelta delta value to traverse
// the hemisphere; decreasing or increasing the sample delta
// will increase or decrease the accuracy respectively.
const float sampleDelta = 0.025;
const float sampleDelta = 0.100;
float nrSamples = 0.0;

for(float phi = 0.0; phi < 2.0 * PI; phi += sampleDelta)
float randomOffset = random(gl_FragCoord.xy) * sampleDelta;
for(float rawPhi = 0.0; rawPhi < 2.0 * PI; rawPhi += sampleDelta)
{
for(float theta = 0.0; theta < ( 0.5 ) * PI; theta += sampleDelta)
float phi = rawPhi + randomOffset;
for(float rawTheta = 0.0; rawTheta < ( 0.5 ) * PI; rawTheta += sampleDelta)
{
float theta = rawTheta + randomOffset;
// spherical to cartesian (in tangent space) // tangent space to world // add each sample result to irradiance
float x = sin(theta) * cos(phi);
float y = sin(theta) * sin(phi);
Expand Down
38 changes: 30 additions & 8 deletions src/webgl/shaders/imageLightSpecular.frag
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ vec2 nTOE( vec3 v ){


void main(){
const int SAMPLE_COUNT = 1024; // 4096
const int SAMPLE_COUNT = 400; // 4096
int lowRoughnessLimit = int(pow(2.0,(roughness+0.1)*20.0));
float totalWeight = 0.0;
vec3 prefilteredColor = vec3(0.0);
float phi = vTexCoord.x * 2.0 * PI;
Expand All @@ -48,6 +49,11 @@ void main(){
vec3 V = N;
for (int i = 0; i < SAMPLE_COUNT; ++i)
{
// break at smaller sample numbers for low roughness levels
if(i == lowRoughnessLimit)
{
break;
}
vec2 Xi = HammersleyNoBitOps(i, SAMPLE_COUNT);
vec3 H = ImportanceSampleGGX(Xi, N, roughness);
vec3 L = normalize(2.0 * dot(V, H) * H - V);
Expand Down Expand Up @@ -88,22 +94,38 @@ vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness){

float VanDerCorput(int n, int base)
{
#ifdef WEBGL2

uint bits = uint(n);
bits = (bits << 16u) | (bits >> 16u);
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
return float(bits) * 2.3283064365386963e-10; // / 0x100000000

#else

float invBase = 1.0 / float(base);
float denom = 1.0;
float result = 0.0;


for (int i = 0; i < 32; ++i)
{
if (n > 0)
{
denom = mod(float(n), 2.0);
result += denom * invBase;
invBase = invBase / 2.0;
n = int(float(n) / 2.0);
}
if (n > 0)
{
denom = mod(float(n), 2.0);
result += denom * invBase;
invBase = invBase / 2.0;
n = int(float(n) / 2.0);
}
}


return result;

#endif
}

vec2 HammersleyNoBitOps(int i, int N)
Expand Down
Loading