54 : weight(weight), reverse_pdf(reverse_pdf), pdf(pdf) { }
57 : weight(eval), reverse_pdf(1.0f), pdf(1.0f) { }
87 const float wavelength,
93 AtRGB (*Albedo)(
const AtBSDF* bsdf,
96 bool (*Merge)(AtBSDF* bsdf,
97 const AtBSDF* other_bsdf);
104#define AI_BSDF_EXPORT_METHODS(tag) \
108static AtBSDFMethods ai_bsdf_methods = { \
117AtBSDFMethods* tag = &ai_bsdf_methods;
129static void Init(const AtShaderGlobals* sg, \
145static AtBSDFLobeMask Eval(const AtBSDF* bsdf, \
146 const AtVector& wi, \
147 const AtBSDFLobeMask lobe_mask, \
148 const bool need_pdf, \
149 AtBSDFLobeSample out_lobes[])
161static AtBSDFLobeMask Sample(const AtBSDF* bsdf, \
162 const AtVector rnd, \
163 const float wavelength, \
164 const AtBSDFLobeMask lobe_mask, \
165 const bool need_pdf, \
166 AtVectorDv& out_wi, \
167 int& out_lobe_index, \
168 AtBSDFLobeSample out_lobes[])
174static AtRGB Albedo(const AtBSDF* bsdf, const AtShaderGlobals* sg, const AtBSDFLobeMask lobe_mask); \
175AI_OPTIONAL_METHOD_INSTALL(ai_bsdf_methods, Albedo) \
176static AtRGB Albedo(const AtBSDF* bsdf, const AtShaderGlobals* sg, const AtBSDFLobeMask lobe_mask)
189static bool Merge(AtBSDF* bsdf, const AtBSDF* other_bsdf); \
190AI_OPTIONAL_METHOD_INSTALL(ai_bsdf_methods, Merge) \
191static bool Merge(AtBSDF* bsdf, const AtBSDF* other_bsdf)
199#define bsdf_interior \
200static AtClosureList Interior(const AtShaderGlobals* sg, AtBSDF* bsdf); \
201AI_OPTIONAL_METHOD_INSTALL(ai_bsdf_methods, Interior) \
202static AtClosureList Interior(const AtShaderGlobals* sg, AtBSDF* bsdf)
208#ifdef AI_CPU_COMPILER
219AI_API AI_DEVICE
void AiBSDFGetDirectIndirect(
const AtBSDF* bsdf,
float& weight_direct,
float& weight_indirect);
252 float r = 0.0f,
bool transmission =
false,
265 float ior,
float rx,
float ry,
266 uint8_t exit_type = 0,
267 int32_t dielectric_priority = 0,
268 float thin_walled_transmission = 0,
271AI_API AI_DEVICE AtBSDF*
274 float ior,
float rx,
float ry,
float dispersion,
276 uint8_t exit_type = 0,
277 int32_t dielectric_priority = 0,
280AI_API AI_DEVICE AtBSDF*
283 float eta,
float rx,
float ry,
284 uint8_t exit_type = 0,
290#define AI_MICROFACET_BECKMANN 0x00
291#define AI_MICROFACET_GGX 0x01
323 const AtRGB& fresnel1,
const AtRGB& fresnel2,
float fresnel_weight,
336 const float roughness_longitudinal,
const float roughness_azimuthal,
Color types and utilities.
Ray struct and various trace functions.
Shader globals struct, methods and macros.
Vector math types, operators and utilities.
Arnold String allows for fast string comparisons.
Definition: ai_string.h:54
AtMetalFresnelMode
Metal Fresnel mode.
Definition: ai_shader_bsdf.h:315
AtBSDFLobeFlags
BSDF Lobe flags.
Definition: ai_shader_bsdf.h:30
AtOrenNayarModel
Oren-Nayar mode.
Definition: ai_shader_bsdf.h:244
AI_API AI_DEVICE void AiBSDFGetDirectIndirect(const AtBSDF *bsdf, float &weight_direct, float &weight_indirect)
Get the BSDF direct and indirect light contribution weights.
Definition: ai_shader_bsdf.cpp:807
AI_API const AtBSDFLobeInfo * AiBSDFGetLobes(const AtBSDF *bsdf)
Get BSDF lobes, available after the BSDF has been initialized.
Definition: ai_shader_bsdf.cpp:762
AI_API AI_DEVICE AtBSDF * AiFuzzBSDF(const AtShaderGlobals *sg, const AtRGB &weight, const AtVector &N, const float r, const AtString label=AtString())
Create Fuzz BSDF for dusty/fuzzy/textile materials.
Definition: ai_shader_bsdf.cpp:610
AI_API AI_DEVICE AtBSDF * AiOrenNayarBSDF(const AtShaderGlobals *sg, const AtRGB &weight, const AtVector &N, AtOrenNayarModel model=AtOrenNayarModel::ENERGY_PRESERVING, float r=0.0f, bool transmission=false, const AtString label=AtString())
Create Oren-Nayar BSDF.
Definition: ai_shader_bsdf.cpp:172
AI_API void AiBSDFIntegrate(AtShaderGlobals *sg, AtRGB *direct, AtRGB *indirect, AtBSDF *bsdf)
Returns the direct and indirect radiance reflected by the provided BSDF.
Definition: ai_shader_bsdf.cpp:661
AI_API AI_DEVICE AtRGB AiBSDFAlbedo(const AtShaderGlobals *sg, AtBSDF *bsdf)
Returns BSDF albedo for incident direction sg->Rd, i.e.
Definition: ai_shader_bsdf.cpp:206
AI_API const AtBSDFMethods * AiBSDFGetMethods(const AtBSDF *bsdf)
Get BSDF methods.
Definition: ai_shader_bsdf.cpp:727
AI_API AI_DEVICE void AiBSDFInitNormal(AtBSDF *bsdf, const AtVector &N, bool bounding)
Initialize BSDF normal.
Definition: ai_shader_bsdf.cpp:715
AI_API AI_DEVICE AtBSDF * AiSheenBSDF(const AtShaderGlobals *sg, const AtRGB &weight, const AtVector &N, const float r, const AtString label=AtString())
Create Sheen BSDF for cloth-like materials.
Definition: ai_shader_bsdf.cpp:571
AI_API AI_DEVICE void AiBSDFInitLobes(AtBSDF *bsdf, const AtBSDFLobeInfo *lobes, int num_lobes)
Initialize BSDF lobes.
Definition: ai_shader_bsdf.cpp:694
AI_API AI_DEVICE float AiBSDFBumpShadow(const AtVector &Ns, const AtVector &N, const AtVector &Ld)
Compute BSDF shadow factor to solve shading artifacts with bump mapping.
Definition: ai_shader_bsdf.cpp:846
AI_API AI_DEVICE void AiMicrofacetSetThinFilm(AtBSDF *bsdf, float weight, float thickness, float ior)
Set the thickness and refractive index of a thin film layered on top of a microfacet surface.
Definition: ai_shader_bsdf.cpp:825
uint32_t AtBSDFLobeMask
BSDF lobe bitmask.
Definition: ai_shader_bsdf.h:47
AI_API int AiBSDFGetNumLobes(const AtBSDF *bsdf)
Get the number of BSDF lobes, available after the BSDF has been initialized.
Definition: ai_shader_bsdf.cpp:773
AI_API AI_DEVICE AtBSDF * AiMicrofacetRefractionBSDF(const AtShaderGlobals *sg, const AtRGB &weight, int distribution, const AtVector &N, const AtVector *U, float ior, float rx, float ry, float dispersion, bool use_fresnel=true, AtClosureList interior_volume=AtClosureList(), uint8_t exit_type=0, int32_t dielectric_priority=0, const AtString label=AtString())
Create microfacet refraction BSDF.
Definition: ai_shader_bsdf.cpp:314
AI_API AI_DEVICE AtBSDF * AidEonBSDF(const AtShaderGlobals *sg, const AtRGB &absorption, const AtRGB weights[3], const AtVector &tangent, const float roughness_longitudinal, const float roughness_azimuthal, const float eta, const float tilt, const AtString label=AtString())
Create d'Eon BSDF for hair.
Definition: ai_shader_bsdf.cpp:495
AI_API AtBSDF * AiBSDF(const AtShaderGlobals *sg, const AtRGB &weight, const AtBSDFMethods *methods, size_t data_size)
Allocate a BSDF and data memory to store parameters.
Definition: ai_shader_bsdf.cpp:128
AI_API AI_DEVICE AtBSDF * AiMetalBSDF(const AtShaderGlobals *sg, const AtRGB &weight, int distribution, const AtVector &N, const AtVector *U, AtMetalFresnelMode fresnel_mode, const AtRGB &fresnel1, const AtRGB &fresnel2, float fresnel_weight, float rx, float ry, const AtString label=AtString())
Create microfacet BSDF with conductive Fresnel, for metals.
Definition: ai_shader_bsdf.cpp:431
AI_API AI_DEVICE AtBSDF * AiZinkeBSDF(const AtShaderGlobals *sg, const AtRGB &weight, const AtVector &tangent, const AtString label=AtString())
Create Zinke BSDF for hair with Lambertian reflectance properties.
Definition: ai_shader_bsdf.cpp:539
AI_API AI_DEVICE void AiBSDFSetDirectIndirect(AtBSDF *bsdf, float weight_direct, float weight_indirect)
Set the BSDF direct and indirect light contribution weights.
Definition: ai_shader_bsdf.cpp:791
AI_API AI_DEVICE AtRGB AiBSDFGetWeight(const AtBSDF *bsdf)
Get the BSDF weight.
Definition: ai_shader_bsdf.cpp:750
AI_API AI_DEVICE void * AiBSDFGetData(const AtBSDF *bsdf)
Get BSDF data memory to store BSDF parameters.
Definition: ai_shader_bsdf.cpp:739
AI_API AI_DEVICE AtBSDF * AiMicrofacetBSDF(const AtShaderGlobals *sg, const AtRGB &weight, int distribution, const AtVector &N, const AtVector *U, float ior, float rx, float ry, uint8_t exit_type=0, int32_t dielectric_priority=0, float thin_walled_transmission=0, const AtString label=AtString())
Create microfacet reflection BSDF.
Definition: ai_shader_bsdf.cpp:249
AI_API AI_DEVICE AtBSDF * AiMicrofacetThinWallRefractionBSDF(const AtShaderGlobals *sg, const AtRGB &weight, int distribution, const AtVector &N, const AtVector *U, float eta, float rx, float ry, uint8_t exit_type=0, AtString label=AtString())
Create thin-walled microfacet refraction BSDF.
Definition: ai_shader_bsdf.cpp:378
AI_API AI_DEVICE float AiBSDFMinRoughness(const AtShaderGlobals *sg)
Estimate a minimum roughness for specular BSDFs, to reduce noise from caustics.
Definition: ai_shader_bsdf.cpp:895
@ AI_BSDF_LOBE_WAVELENGTH_SAMPLE
Sampling the BSDF lobe requires a wavelength
Definition: ai_shader_bsdf.h:32
@ AI_BSDF_LOBE_SINGULAR
Sampling the BSDF always returns the same direction.
Definition: ai_shader_bsdf.h:31
@ AI_BSDF_LOBE_EXIT_WHITE
If ray depth exceeded, use white color
Definition: ai_shader_bsdf.h:34
@ AI_BSDF_LOBE_EXIT_BACKGROUND
If ray depth exceeded, use background color
Definition: ai_shader_bsdf.h:33
BSDF lobe information.
Definition: ai_shader_bsdf.h:39
BSDF lobe sample.
Definition: ai_shader_bsdf.h:52
BSDF function table.
Definition: ai_shader_bsdf.h:76
Definition: ai_closure.h:85
RGB color.
Definition: ai_color.h:32
Shader globals data structure.
Definition: ai_shaderglobals.h:45
Vector with differentials.
Definition: ai_vector.h:515
3D point (single precision)
Definition: ai_vector.h:30