[Bf-blender-cvs] [6006f91] cycles_disney_brdf: disney implementation cleaned
Pascal Schoen
noreply at git.blender.org
Tue May 17 10:46:51 CEST 2016
Commit: 6006f91e8730f78df5874f808690d3908db103ab
Author: Pascal Schoen
Date: Wed May 4 16:08:10 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB6006f91e8730f78df5874f808690d3908db103ab
disney implementation cleaned
===================================================================
M intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
M intern/cycles/kernel/closure/bsdf_disney_diffuse.h
M intern/cycles/kernel/closure/bsdf_disney_specular.h
M intern/cycles/kernel/closure/bsdf_util.h
M intern/cycles/kernel/osl/bsdf_disney_clearcoat.cpp
M intern/cycles/kernel/osl/bsdf_disney_diffuse.cpp
M intern/cycles/kernel/osl/bsdf_disney_specular.cpp
M intern/cycles/util/util_math.h
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
index 6d09cb0..0300c56 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
@@ -35,16 +35,6 @@
CCL_NAMESPACE_BEGIN
-#define MIX(x, y, a) (x * (1.0f - a) + y * a)
-
-/* DISNEY CLEARCOAT */
-
-ccl_device float clear_SchlickFresnel(float u) {
- float m = clamp(1.0f - u, 0.0f, 1.0f);
- float m2 = m * m;
- return m2 * m2 * m; // pow(m, 5)
-}
-
/* structures */
struct DisneyClearcoatBRDFParams {
// brdf parameters
@@ -55,105 +45,13 @@ struct DisneyClearcoatBRDFParams {
float m_clearcoatRoughness;
void precompute_values() {
- m_clearcoatRoughness = MIX(0.1f, 0.001f, m_clearcoatGloss);
+ m_clearcoatRoughness = mix(0.1f, 0.001f, m_clearcoatGloss);
}
};
typedef struct DisneyClearcoatBRDFParams DisneyClearcoatBRDFParams;
-ccl_device_inline void clear_microfacet_ggx_sample_slopes(
- const float cos_theta_i, const float sin_theta_i,
- float randu, float randv, float *slope_x, float *slope_y,
- float *G1i)
-{
- /* special case (normal incidence) */
- if(cos_theta_i >= 0.99999f) {
- const float r = safe_sqrtf(randu/(1.0f - randu));
- const float phi = M_2PI_F * randv;
- *slope_x = r * cosf(phi);
- *slope_y = r * sinf(phi);
- *G1i = 1.0f;
-
- return;
- }
-
- /* precomputations */
- const float tan_theta_i = sin_theta_i/cos_theta_i;
- const float G1_inv = 0.5f * (1.0f + safe_sqrtf(1.0f + tan_theta_i*tan_theta_i));
-
- *G1i = 1.0f/G1_inv;
-
- /* sample slope_x */
- const float A = 2.0f*randu*G1_inv - 1.0f;
- const float AA = A*A;
- const float tmp = 1.0f/(AA - 1.0f);
- const float B = tan_theta_i;
- const float BB = B*B;
- const float D = safe_sqrtf(BB*(tmp*tmp) - (AA - BB)*tmp);
- const float slope_x_1 = B*tmp - D;
- const float slope_x_2 = B*tmp + D;
- *slope_x = (A < 0.0f || slope_x_2*tan_theta_i > 1.0f)? slope_x_1: slope_x_2;
-
- /* sample slope_y */
- float S;
-
- if(randv > 0.5f) {
- S = 1.0f;
- randv = 2.0f*(randv - 0.5f);
- }
- else {
- S = -1.0f;
- randv = 2.0f*(0.5f - randv);
- }
-
- const float z = (randv*(randv*(randv*0.27385f - 0.73369f) + 0.46341f)) / (randv*(randv*(randv*0.093073f + 0.309420f) - 1.000000f) + 0.597999f);
- *slope_y = S * z * safe_sqrtf(1.0f + (*slope_x)*(*slope_x));
-}
-
-ccl_device_inline float3 clear_microfacet_sample_stretched(
- const float3 omega_i, const float alpha_x, const float alpha_y,
- const float randu, const float randv,
- bool beckmann, float *G1i)
-{
- /* 1. stretch omega_i */
- float3 omega_i_ = make_float3(alpha_x * omega_i.x, alpha_y * omega_i.y, omega_i.z);
- omega_i_ = normalize(omega_i_);
-
- /* get polar coordinates of omega_i_ */
- float costheta_ = 1.0f;
- float sintheta_ = 0.0f;
- float cosphi_ = 1.0f;
- float sinphi_ = 0.0f;
-
- if(omega_i_.z < 0.99999f) {
- costheta_ = omega_i_.z;
- sintheta_ = safe_sqrtf(1.0f - costheta_*costheta_);
-
- float invlen = 1.0f/sintheta_;
- cosphi_ = omega_i_.x * invlen;
- sinphi_ = omega_i_.y * invlen;
- }
-
- /* 2. sample P22_{omega_i}(x_slope, y_slope, 1, 1) */
- float slope_x, slope_y;
-
- clear_microfacet_ggx_sample_slopes(costheta_, sintheta_,
- randu, randv, &slope_x, &slope_y, G1i);
-
- /* 3. rotate */
- float tmp = cosphi_*slope_x - sinphi_*slope_y;
- slope_y = sinphi_*slope_x + cosphi_*slope_y;
- slope_x = tmp;
-
- /* 4. unstretch */
- slope_x = alpha_x * slope_x;
- slope_y = alpha_y * slope_y;
-
- /* 5. compute normal */
- return normalize(make_float3(-slope_x, -slope_y, 1.0f));
-}
-
ccl_device int bsdf_disney_clearcoat_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_DISNEY_CLEARCOAT_ID;
@@ -199,8 +97,8 @@ ccl_device float3 bsdf_disney_clearcoat_eval_reflect(const ShaderClosure *sc,
/* eq. 20 */
float common = D * 0.25f / cosNO;
- float FH = clear_SchlickFresnel(dot(omega_in, m));
- float3 F = MIX(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
+ float FH = schlick_fresnel(dot(omega_in, m));
+ float3 F = mix(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
float3 out = F * G * common * 0.25f * params->m_clearcoat;
@@ -246,7 +144,7 @@ ccl_device int bsdf_disney_clearcoat_sample(const ShaderClosure *sc, const Disne
float3 m;
float G1o;
- local_m = clear_microfacet_sample_stretched(local_I, alpha, alpha,
+ local_m = importance_sample_microfacet_stretched(local_I, alpha, alpha,
randu, randv, false, &G1o);
m = X*local_m.x + Y*local_m.y + Z*local_m.z;
@@ -288,8 +186,8 @@ ccl_device int bsdf_disney_clearcoat_sample(const ShaderClosure *sc, const Disne
float common = (G1o * D) * 0.25f / cosNO;
*pdf = common;
- float FH = clear_SchlickFresnel(dot(*omega_in, m));
- float3 F = MIX(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
+ float FH = schlick_fresnel(dot(*omega_in, m));
+ float3 F = mix(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
*eval = G1i * common * F * 0.25f * params->m_clearcoat;
}
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index fa4b17c..3e44277 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -34,71 +34,8 @@
#ifndef __BSDF_DISNEY_DIFFUSE_H__
#define __BSDF_DISNEY_DIFFUSE_H__
-#include <cmath>
-
CCL_NAMESPACE_BEGIN
-/* DISNEY DIFFUSE */
-
-ccl_device float diff_sqr(float a) {
- return a * a;
-}
-
-ccl_device float3 diff_mon2lin(float3 x, float gamma) {
- return make_float3(pow(x[0], gamma), pow(x[1], gamma), pow(x[2], gamma));
-}
-
-ccl_device float diff_GTR1(float NdotH, float a) {
- if (a >= 1.0f) return 1.0f / M_PI_F;
- float a2 = a*a;
- float t = 1.0f + (a2 - 1.0f) * NdotH * NdotH;
- return (a2 - 1.0f) / (M_PI_F * log(a2) * t);
-}
-
-ccl_device float diff_GTR2(float NdotH, float a) {
- float a2 = a * a;
- float t = 1.0f + (a2 - 1.0f) * NdotH * NdotH;
- return a2 / (M_PI_F * t * t);
-}
-
-ccl_device float diff_GTR2_aniso(
- float NdotH,
- float HdotX,
- float HdotY,
- float ax,
- float ay)
-{
- return 1.0f / (M_PI_F * ax * ay * diff_sqr(diff_sqr(HdotX / ax) + diff_sqr(HdotY / ay)
- + NdotH * NdotH));
-}
-
-ccl_device float diff_smithG_GGX(float Ndotv, float alphaG) {
- float a = alphaG * alphaG;
- float b = Ndotv * Ndotv;
- return 1.0f / (Ndotv + sqrtf(a + b - a * b));
-}
-
-ccl_device float diff_SchlickFresnel(float u) {
- float m = clamp(1.0f - u, 0.0f, 1.0f);
- float m2 = m * m;
- return m2 * m2 * m; // pow(m, 5)
-}
-
-ccl_device float3 diff_transform_to_local(const float3& v, const float3& n,
- const float3& x, const float3& y)
-{
- return make_float3(dot(v, x), dot(v, n), dot(v, y));
-}
-
-ccl_device float3 diff_mix(float3 x, float3 y, float a) {
- return x * (1.0f - a) + y * a;
-}
-
-ccl_device float diff_mix(float x, float y, float a) {
- return x * (1.0f - a) + y * a;
-}
-
-/* structures */
struct DisneyDiffuseBRDFParams {
// brdf parameters
float3 m_base_color;
@@ -110,23 +47,22 @@ struct DisneyDiffuseBRDFParams {
// precomputed values
float3 m_cdlin, m_ctint, m_csheen;
float m_cdlum;
- float m_weights[4];
void precompute_values() {
m_cdlin = m_base_color;
m_cdlum = 0.3f * m_cdlin[0] + 0.6f * m_cdlin[1] + 0.1f * m_cdlin[2]; // luminance approx.
m_ctint = m_cdlum > 0.0f ? m_cdlin / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
- m_csheen = diff_mix(make_float3(1.0f, 1.0f, 1.0f), m_ctint, m_sheen_tint);
+ m_csheen = mix(make_float3(1.0f, 1.0f, 1.0f), m_ctint, m_sheen_tint);
}
};
typedef struct DisneyDiffuseBRDFParams DisneyDiffuseBRDFParams;
-/* brdf */
+
ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
const DisneyDiffuseBRDFParams *params, float3 N, float3 V, float3 L,
- float3 H, float *pdf, bool withNdotL = true)
+ float3 H, float *pdf)
{
float NdotL = dot(N, L);
float NdotV = dot(N, V);
@@ -139,61 +75,32 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
float LdotH = dot(L, H);
float Fd = 0.0f;
- float FL = diff_SchlickFresnel(NdotL), FV = diff_SchlickFresnel(NdotV);
+ float FL = schlick_fresnel(NdotL), FV = schlick_fresnel(NdotV);
if (params->m_subsurface != 1.0f) {
const float Fd90 = 0.5f + 2.0f * LdotH*LdotH * params->m_roughness;
- Fd = diff_mix(1.0f, Fd90, FL) * diff_mix(1.0f, Fd90, FV);
+ Fd = mix(1.0f, Fd90, FL) * mix(1.0f, Fd90, FV);
}
if (params->m_subsurface > 0.0f) {
float Fss90 = LdotH*LdotH * params->m_roughness;
- float Fss = diff_mix(1.0f, Fss90, FL) * diff_mix(1.0f, Fss90, FV);
+ float Fss = mix(1.0f, Fss90, FL) * mix(1.0f, Fss90, FV);
float ss = 1.25f * (Fss * (1.0f / (NdotL + NdotV) - 0.5f) + 0.5f);
- Fd = diff_mix(Fd, ss, params->m_subsurface);
+ Fd = mix(Fd, ss, params->m_subsurface);
}
float3 value = M_1_PI_F * Fd * params->m_cdlin;
- //if (params->m_gamma > 0.5f)
- *pdf = M_1_PI_F;
-
- /*if (params->m_exposure > 0.95f)
- *pdf *= params->m_cdlum;
- else if (params->m_exposure > 0.85f)
- *pdf *= params->m_cdlum * NdotL;
- else if (params->m_exposure > 0.75f)
- *pdf *= params->m_cdlum * 0.5f;
- else if (params->m_exposure > 0.65f)
- *pdf *= params->m_cdlum * NdotL * 0.5f;
- else if (params->m_exposure > 0.55f)
- *pdf *= NdotL;
- else if (params->m_exposure > 0.45f)
- *pdf *= NdotL * 0.5f;
- else if (params->m_exposure > 0.35f)*/
- *pdf *= 0.5f;
+ *pdf = M_1_PI_F * 0.5f;
// sheen component
if (params->m_sheen != 0.0f) {
- float FH = diff_SchlickFresnel(LdotH);
+ float FH = schlick_fresnel(LdotH);
value += FH * params->m_sheen * params->m_csheen;
- //*pdf += 0.5f * M_1_PI_F * params->m_sheen;
}
- if (withNdotL)
- value *= NdotL;
-
- // brightness
- //value *= params->m_brightness;
-
- // exposure
- //value *= pow(2.0f, params->m_exposure);
-
- // gamma
- /*value[0] = pow(value[0], 1.0f / params->m_gamma);
- value[1] = pow(value[1], 1.0f / params->m_gamma);
- value[2] = pow(value[2], 1.0f / params->m_gamma);*/
+ value *= NdotL;
return value;
}
@@ -236,17 +143,12 @@ ccl_device int bsd
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list