30 const bool wo_outside,
43 if (wi.z * wo.z < 0.0f) {
61 if (wi.z < 1e-5f || (wo.z < 1e-5f && wo_outside) || (wo.z > -1e-5f && !wo_outside))
76 eval *= -lambda_r / (shadowing_lambda - lambda_r);
78 eval *= -lambda_r *
beta(-lambda_r, shadowing_lambda + 1.0f);
80 const float G2 = 1.0f / (1.0f - (lambda_r + 1.0f) + shadowing_lambda);
81 float val = G2 * 0.25f / wi.z;
112 #ifdef MF_MULTI_GLASS
113 if (
order == 0 && use_fresnel) {
121 eval = throughput * phase *
122 mf_G1(wo_outside ? wo : -wo,
123 mf_C1((outside == wo_outside) ? hr : -hr),
130 #ifdef MF_MULTI_GLASS
138 eval += throughput * phase *
139 mf_G1(wo_outside ? wo : -wo,
140 mf_C1((outside == wo_outside) ? hr : -hr),
143 if (
order + 1 < 10) {
145 #ifdef MF_MULTI_GLASS
156 if (use_fresnel && !next_outside) {
159 else if (use_fresnel &&
order > 0) {
163 if (use_fresnel &&
order > 0) {
175 G1_r =
mf_G1(wr, C1_r, lambda_r);
180 eval *=
fabsf(wi.z / wo.z);
219 *wo = outside ? wr : -wr;
228 if (!use_fresnel &&
order > 0)
232 #ifdef MF_MULTI_GLASS
251 throughput = t_color;
253 throughput *= t_color;
261 throughput = t_color;
263 throughput *= t_color;
270 G1_r =
mf_G1(wr, C1_r, lambda_r);
276 #undef MF_MULTI_GLASS
277 #undef MF_MULTI_GLOSSY
278 #undef MF_PHASE_FUNCTION
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint order
ccl_device_forceinline bool mf_sample_height(const float3 w, float *h, float *C1, float *G1, float *lambda, const float U)
ccl_device_forceinline float3 mf_eval_phase_glossy(const float3 w, const float lambda, const float3 wo, const float2 alpha)
ccl_device_forceinline float D_ggx_aniso(const float3 wm, const float2 alpha)
ccl_device_forceinline float mf_C1(const float h)
ccl_device_forceinline float mf_lambda(const float3 w, const float2 alpha)
ccl_device_forceinline float3 mf_eval_phase_glass(const float3 w, const float lambda, const float3 wo, const bool wo_outside, const float2 alpha, const float eta)
ccl_device_forceinline float3 mf_sample_phase_glass(const float3 wi, const float eta, const float3 wm, const float randV, bool *outside)
#define MF_FUNCTION_FULL_NAME(prefix)
CCL_NAMESPACE_BEGIN ccl_device_forceinline float D_ggx(float3 wm, float alpha)
ccl_device_forceinline float3 mf_sample_vndf(const float3 wi, const float2 alpha, const float randx, const float randy)
ccl_device_forceinline float3 mf_sample_phase_glossy(const float3 wi, float3 *weight, const float3 wm)
ccl_device_forceinline float mf_G1(const float3 w, const float C1, const float lambda)
ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME() mf_eval(float3 wi, float3 wo, const bool wo_outside, const float3 color, const float alpha_x, const float alpha_y, ccl_addr_space uint *lcg_state, const float eta, bool use_fresnel, const float3 cspec0)
ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME() mf_sample(float3 wi, float3 *wo, const float3 color, const float alpha_x, const float alpha_y, ccl_addr_space uint *lcg_state, const float eta, bool use_fresnel, const float3 cspec0)
ccl_device float fresnel_dielectric_cos(float cosi, float eta)
ccl_device_forceinline float3 interpolate_fresnel_color(float3 L, float3 H, float ior, float F0, float3 cspec0)
static CCL_NAMESPACE_BEGIN const double alpha
#define ccl_device_forceinline
#define make_float2(x, y)
#define make_float3(x, y, z)
ccl_device float lcg_step_float_addrspace(ccl_addr_space uint *rng)
ccl_device_inline float beta(float x, float y)
ccl_device_inline float2 normalize(const float2 &a)