15 typedef struct PhongRampBsdf {
22 static_assert(
sizeof(
ShaderClosure) >=
sizeof(PhongRampBsdf),
"PhongRampBsdf is too large!");
28 float npos =
pos * (
float)(MAXCOLORS - 1);
32 if (ipos >= (MAXCOLORS - 1))
33 return colors[MAXCOLORS - 1];
35 return colors[ipos] * (1.0f -
offset) + colors[ipos + 1] *
offset;
41 bsdf->exponent =
max(bsdf->exponent, 0.0f);
51 float m_exponent = bsdf->exponent;
52 float cosNI =
dot(bsdf->N, omega_in);
53 float cosNO =
dot(bsdf->N,
I);
55 if (cosNI > 0 && cosNO > 0) {
57 float3 R = (2 * cosNO) * bsdf->N -
I;
58 float cosRI =
dot(
R, omega_in);
60 float cosp =
powf(cosRI, m_exponent);
61 float common = 0.5f *
M_1_PI_F * cosp;
62 float out = cosNI * (m_exponent + 2) * common;
63 *pdf = (m_exponent + 1) * common;
64 return bsdf_phong_ramp_get_color(bsdf->colors, cosp) *
out;
94 float cosNO =
dot(bsdf->N,
I);
95 float m_exponent = bsdf->exponent;
99 float3 R = (2 * cosNO) * bsdf->N -
I;
102 *domega_in_dx = (2 *
dot(bsdf->N, dIdx)) * bsdf->N - dIdx;
103 *domega_in_dy = (2 *
dot(bsdf->N, dIdy)) * bsdf->N - dIdy;
109 float cosTheta =
powf(randv, 1 / (m_exponent + 1));
110 float sinTheta2 = 1 - cosTheta * cosTheta;
111 float sinTheta = sinTheta2 > 0 ?
sqrtf(sinTheta2) : 0;
112 *omega_in = (
cosf(phi) * sinTheta) *
T + (
sinf(phi) * sinTheta) *
B + (cosTheta)*
R;
113 if (
dot(Ng, *omega_in) > 0.0f) {
115 float cosNI =
dot(bsdf->N, *omega_in);
118 float cosp =
powf(cosTheta, m_exponent);
119 float common = 0.5f *
M_1_PI_F * cosp;
120 *pdf = (m_exponent + 1) * common;
121 float out = cosNI * (m_exponent + 2) * common;
122 *eval = bsdf_phong_ramp_get_color(bsdf->colors, cosp) *
out;
typedef float(TangentPoint)[2]
#define CCL_NAMESPACE_END
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
@ CLOSURE_BSDF_PHONG_RAMP_ID
#define SHADER_CLOSURE_BASE
#define __RAY_DIFFERENTIALS__
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
ccl_device_inline int float_to_int(float f)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)