43 float3 disk_N, disk_T, disk_B;
44 float pick_pdf_N, pick_pdf_T, pick_pdf_B;
55 else if (disk_v < 0.75f) {
62 disk_v = (disk_v - 0.5f) * 4.0f;
71 disk_v = (disk_v - 0.75f) * 4.0f;
76 float disk_height, disk_r;
80 float3 disk_P = (disk_r *
cosf(phi)) * disk_T + (disk_r *
sinf(phi)) * disk_B;
83 ray.P =
P + disk_N * disk_height + disk_P;
86 ray.tmax = 2.0f * disk_height;
101 scene_intersect_local(kg, &ray, &ss_isect,
object, &lcg_state, max_hits);
102 const int num_eval_hits =
min(ss_isect.num_hits, max_hits);
103 if (num_eval_hits == 0) {
112 float sum_weights = 0.0f;
114 for (
int hit = 0; hit < num_eval_hits; hit++) {
116 const int object = ss_isect.hits[hit].object;
118 float3 hit_Ng = ss_isect.Ng[hit];
129 object_fetch_transform_motion_test(kg,
object,
time, &itfm);
134 const float3 hit_P = ray.P + ray.D * ss_isect.hits[hit].t;
137 const float pdf_N = pick_pdf_N *
fabsf(
dot(disk_N, hit_Ng));
138 const float pdf_T = pick_pdf_T *
fabsf(
dot(disk_T, hit_Ng));
139 const float pdf_B = pick_pdf_B *
fabsf(
dot(disk_B, hit_Ng));
144 float w = pdf_N / (
sqr(pdf_N) +
sqr(pdf_T) +
sqr(pdf_B));
145 if (ss_isect.num_hits > max_hits) {
146 w *= ss_isect.num_hits / (
float)max_hits;
150 const float r =
len(hit_P -
P);
156 ss_isect.Ng[hit] = hit_Ng;
157 weights[hit] = weight;
161 if (sum_weights == 0.0f) {
167 float partial_sum = 0.0f;
169 for (
int hit = 0; hit < num_eval_hits; hit++) {
170 const float3 weight = weights[hit];
172 float next_sum = partial_sum + sample_weight;
178 ss_isect.hits[0] = ss_isect.hits[hit];
179 ss_isect.Ng[0] = ss_isect.Ng[hit];
181 ray.P = ray.P + ray.D * ss_isect.hits[hit].t;
182 ray.D = ss_isect.Ng[hit];
188 partial_sum = next_sum;
typedef float(TangentPoint)[2]
_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 const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
ccl_device_forceinline float3 bssrdf_eval(const float3 radius, float r)
ccl_device void bssrdf_sample(const float3 radius, float xi, ccl_private float *r, ccl_private float *h)
ccl_device_forceinline float bssrdf_pdf(const float3 radius, float r)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_inline void sort_intersections_and_normals(ccl_private Intersection *hits, ccl_private float3 *Ng, uint num_hits)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
ccl_device_forceinline float differential_zero_compact()
@ PATH_RAY_SUBSURFACE_BACKFACING
@ SD_OBJECT_TRANSFORM_APPLIED
@ SD_OBJECT_NEGATIVE_SCALE_APPLIED
ccl_device_inline uint lcg_state_init(const uint rng_hash, const uint rng_offset, const uint sample, const uint scramble)
ccl_device float lcg_step_float(T rng)
ccl_device_inline float average(const float2 &a)
ccl_device_inline float2 fabs(const float2 &a)
ccl_device_inline float3 zero_float3()
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
ccl_device_inline void path_state_rng_2D(KernelGlobals kg, ccl_private const RNGState *rng_state, int dimension, ccl_private float *fx, ccl_private float *fy)
IntegratorStateCPU *ccl_restrict IntegratorState
#define INTEGRATOR_STATE_WRITE(state, nested_struct, member)
#define INTEGRATOR_STATE(state, nested_struct, member)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 subsurface_disk_eval(const float3 radius, float disk_r, float r)
ccl_device_inline bool subsurface_disk(KernelGlobals kg, IntegratorState state, RNGState rng_state, ccl_private Ray &ray, ccl_private LocalIntersection &ss_isect)
ccl_device_inline float sqr(float a)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)