[Bf-blender-cvs] [4b21e2f0ae5] principled-v2: Fix Precomputation code
Lukas Stockner
noreply at git.blender.org
Sun Oct 30 00:17:16 CEST 2022
Commit: 4b21e2f0ae52f3c4b6039a505d8bd99f2f054fd8
Author: Lukas Stockner
Date: Sun Oct 30 00:14:03 2022 +0200
Branches: principled-v2
https://developer.blender.org/rB4b21e2f0ae52f3c4b6039a505d8bd99f2f054fd8
Fix Precomputation code
===================================================================
M intern/cycles/app/cycles_precompute.cpp
===================================================================
diff --git a/intern/cycles/app/cycles_precompute.cpp b/intern/cycles/app/cycles_precompute.cpp
index 322a9631491..35f94d8615d 100644
--- a/intern/cycles/app/cycles_precompute.cpp
+++ b/intern/cycles/app/cycles_precompute.cpp
@@ -15,10 +15,56 @@
#include "kernel/closure/bsdf_microfacet_glass.h"
#include "kernel/closure/bsdf_principled_sheen.h"
+#include "scene/shader.tables"
+
#include <iostream>
CCL_NAMESPACE_BEGIN
+/* TODO: Is there a way to not duplicate the regular microfacet_ggx_E
+ * without setting up an entire fake KernelGlobals? */
+static float lookup_table_read(const float *table, float x, int size)
+{
+ x = clamp(x * size - 0.5f, 0.0f, (float)size);
+
+ int index = min(float_to_int(x), size - 1);
+ int nindex = min(index + 1, size - 1);
+ float t = x - index;
+
+ float data0 = table[index];
+ if (t == 0.0f)
+ return data0;
+
+ float data1 = table[nindex];
+ return mix(data0, data1, t);
+}
+
+static float lookup_table_read_2D(const float *table, float x, float y, int xsize, int ysize)
+{
+ y = clamp(y * ysize - 0.5f, 0.0f, (float)ysize);
+
+ int index = min(float_to_int(y), ysize - 1);
+ int nindex = min(index + 1, ysize - 1);
+ float t = y - index;
+
+ float data0 = lookup_table_read(table + xsize * nindex, x, xsize);
+ if (t == 0.0f)
+ return data0;
+
+ float data1 = lookup_table_read(table + xsize * nindex, x, xsize);
+ return mix(data0, data1, t);
+}
+
+static float microfacet_ggx_E(float mu, float rough)
+{
+ return lookup_table_read_2D(&table_ggx_E[0][0], mu, 1 - rough, 32, 32);
+}
+
+static float microfacet_ggx_E_avg(float rough)
+{
+ return lookup_table_read(table_ggx_E_avg, 1 - rough, 32);
+}
+
/* From PBRT: core/montecarlo.h */
inline float VanDerCorput(uint32_t n, uint32_t scramble)
{
@@ -47,19 +93,16 @@ static float precompute_sheen_E(float rough, float mu, float u1, float u2)
bsdf.N = make_float3(0.0f, 0.0f, 1.0f);
bsdf.roughness = sqr(rough);
- float3 eval, omega_in, domega_in_dx, domega_in_dy;
+ float3 omega_in;
+ Spectrum eval;
float pdf = 0.0f;
bsdf_principled_sheen_sample((ShaderClosure *)&bsdf,
make_float3(0.0f, 0.0f, 1.0f),
make_float3(sqrtf(1.0f - sqr(mu)), 0.0f, mu),
- zero_float3(),
- zero_float3(),
u1,
u2,
&eval,
&omega_in,
- &domega_in_dx,
- &domega_in_dy,
&pdf);
if (pdf != 0.0f) {
return clamp(average(eval) / pdf, 0.0f, 1e5f);
@@ -86,20 +129,20 @@ static float precompute_clearcoat_E(float rough, float mu, float u1, float u2)
float Fms = Fss * E_avg / (1.0f - Fss * (1.0f - E_avg));
float albedo_scale = 1.0f + Fms * ((1.0f - E) / E);
- float3 eval, omega_in, domega_in_dx, domega_in_dy;
- float pdf = 0.0f;
+ float3 omega_in;
+ Spectrum eval;
+ float pdf = 0.0f, sampled_eta;
+ float2 sampled_roughness;
bsdf_microfacet_ggx_sample((ShaderClosure *)&bsdf,
make_float3(0.0f, 0.0f, 1.0f),
make_float3(sqrtf(1.0f - sqr(mu)), 0.0f, mu),
- zero_float3(),
- zero_float3(),
u1,
u2,
&eval,
&omega_in,
- &domega_in_dx,
- &domega_in_dy,
- &pdf);
+ &pdf,
+ &sampled_roughness,
+ &sampled_eta);
if (pdf != 0.0f) {
/* Encode relative to macrosurface Fresnel, saves resolution.
* TODO: Worth the extra evaluation? */
@@ -120,20 +163,20 @@ static float precompute_ggx_E(float rough, float mu, float u1, float u2)
bsdf.extra = nullptr;
bsdf.T = make_float3(1.0f, 0.0f, 0.0f);
- float3 eval, omega_in, domega_in_dx, domega_in_dy;
- float pdf = 0.0f;
+ float3 omega_in;
+ Spectrum eval;
+ float pdf = 0.0f, sampled_eta;
+ float2 sampled_roughness;
bsdf_microfacet_ggx_sample((ShaderClosure *)&bsdf,
make_float3(0.0f, 0.0f, 1.0f),
make_float3(sqrtf(1.0f - sqr(mu)), 0.0f, mu),
- zero_float3(),
- zero_float3(),
u1,
u2,
&eval,
&omega_in,
- &domega_in_dx,
- &domega_in_dy,
- &pdf);
+ &pdf,
+ &sampled_roughness,
+ &sampled_eta);
if (pdf != 0.0f) {
return average(eval) / pdf;
}
@@ -152,20 +195,20 @@ static float precompute_ggx_refract_E(float rough, float mu, float eta, float u1
bsdf.extra = nullptr;
bsdf.T = make_float3(1.0f, 0.0f, 0.0f);
- float3 eval, omega_in, domega_in_dx, domega_in_dy;
- float pdf = 0.0f;
+ float3 omega_in;
+ Spectrum eval;
+ float pdf = 0.0f, sampled_eta;
+ float2 sampled_roughness;
bsdf_microfacet_ggx_sample((ShaderClosure *)&bsdf,
make_float3(0.0f, 0.0f, 1.0f),
make_float3(sqrtf(1.0f - sqr(mu)), 0.0f, mu),
- zero_float3(),
- zero_float3(),
u1,
u2,
&eval,
&omega_in,
- &domega_in_dx,
- &domega_in_dy,
- &pdf);
+ &pdf,
+ &sampled_roughness,
+ &sampled_eta);
if (pdf != 0.0f) {
return average(eval) / pdf;
}
@@ -184,20 +227,20 @@ static float precompute_ggx_glass_E(float rough, float mu, float eta, float u1,
bsdf.extra = nullptr;
bsdf.T = make_float3(1.0f, 0.0f, 0.0f);
- float3 eval, omega_in, domega_in_dx, domega_in_dy;
- float pdf = 0.0f;
+ float3 omega_in;
+ Spectrum eval;
+ float pdf = 0.0f, sampled_eta;
+ float2 sampled_roughness;
bsdf_microfacet_ggx_glass_sample((ShaderClosure *)&bsdf,
make_float3(0.0f, 0.0f, 1.0f),
make_float3(sqrtf(1.0f - sqr(mu)), 0.0f, mu),
- zero_float3(),
- zero_float3(),
u1,
u2,
&eval,
&omega_in,
- &domega_in_dx,
- &domega_in_dy,
- &pdf);
+ &pdf,
+ &sampled_roughness,
+ &sampled_eta);
if (pdf != 0.0f) {
return average(eval) / pdf;
}
@@ -249,20 +292,20 @@ static float precompute_ggx_dielectric_E(float rough, float mu, float eta, float
float Fms = Fss * E_avg / (1.0f - Fss * (1.0f - E_avg));
extra.dielectric = 1.0f + Fms * ((1.0f - E) / E);
- float3 eval, omega_in, domega_in_dx, domega_in_dy;
- float pdf = 0.0f;
+ float3 omega_in;
+ Spectrum eval;
+ float pdf = 0.0f, sampled_eta;
+ float2 sampled_roughness;
bsdf_microfacet_ggx_sample((ShaderClosure *)&bsdf,
make_float3(0.0f, 0.0f, 1.0f),
make_float3(sqrtf(1.0f - sqr(mu)), 0.0f, mu),
- zero_float3(),
- zero_float3(),
u1,
u2,
&eval,
&omega_in,
- &domega_in_dx,
- &domega_in_dy,
- &pdf);
+ &pdf,
+ &sampled_roughness,
+ &sampled_eta);
if (pdf != 0.0f) {
return average(eval) / pdf;
}
More information about the Bf-blender-cvs
mailing list