Merge branch 'blender-v4.2-release'

This commit is contained in:
Weizhen Huang 2024-06-25 18:50:54 +02:00
commit e49fda3ff8
6 changed files with 23 additions and 17 deletions

@ -82,8 +82,7 @@ ccl_device_inline bool shadow_volume_shader_sample(KernelGlobals kg,
return false;
}
const float density = object_volume_density(kg, sd->object);
*extinction = sd->closure_transparent_extinction * density;
*extinction = sd->closure_transparent_extinction;
return true;
}
@ -116,11 +115,6 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals kg,
}
}
const float density = object_volume_density(kg, sd->object);
coeff->sigma_s *= density;
coeff->sigma_t *= density;
coeff->emission *= density;
return true;
}

@ -465,7 +465,7 @@ ccl_device_inline void volume_shader_eval(KernelGlobals kg,
* for all volumes in the stack into a single array of closures */
sd->num_closure = 0;
sd->num_closure_left = max_closures;
sd->flag = 0;
sd->flag = SD_IS_VOLUME_SHADER_EVAL;
sd->object_flag = 0;
for (int i = 0;; i++) {

@ -774,6 +774,9 @@ ccl_device void osl_closure_emission_setup(KernelGlobals kg,
ccl_private const GenericEmissiveClosure *closure,
float3 *layer_albedo)
{
if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
weight *= object_volume_density(kg, sd->object);
}
emission_setup(sd, rgb_to_spectrum(weight));
}
@ -1056,7 +1059,7 @@ ccl_device void osl_closure_absorption_setup(KernelGlobals kg,
ccl_private const VolumeAbsorptionClosure *closure,
float3 *layer_albedo)
{
volume_extinction_setup(sd, rgb_to_spectrum(weight));
volume_extinction_setup(sd, rgb_to_spectrum(weight * object_volume_density(kg, sd->object)));
}
ccl_device void osl_closure_henyey_greenstein_setup(
@ -1067,6 +1070,7 @@ ccl_device void osl_closure_henyey_greenstein_setup(
ccl_private const VolumeHenyeyGreensteinClosure *closure,
float3 *layer_albedo)
{
weight *= object_volume_density(kg, sd->object);
volume_extinction_setup(sd, rgb_to_spectrum(weight));
ccl_private HenyeyGreensteinVolume *volume = (ccl_private HenyeyGreensteinVolume *)bsdf_alloc(

@ -936,7 +936,7 @@ ccl_device_noinline void svm_node_closure_volume(KernelGlobals kg,
float density = (stack_valid(density_offset)) ? stack_load_float(stack, density_offset) :
__uint_as_float(node.z);
density = mix_weight * fmaxf(density, 0.0f);
density = mix_weight * fmaxf(density, 0.0f) * object_volume_density(kg, sd->object);
/* Compute scattering coefficient. */
Spectrum weight = closure_weight;
@ -998,7 +998,7 @@ ccl_device_noinline int svm_node_principled_volume(KernelGlobals kg,
float primitive_density = 1.0f;
float density = (stack_valid(density_offset)) ? stack_load_float(stack, density_offset) :
__uint_as_float(value_node.x);
density = mix_weight * fmaxf(density, 0.0f);
density = mix_weight * fmaxf(density, 0.0f) * object_volume_density(kg, sd->object);
if (density > CLOSURE_WEIGHT_CUTOFF) {
/* Density and color attribute lookup if available. */
@ -1056,7 +1056,8 @@ ccl_device_noinline int svm_node_principled_volume(KernelGlobals kg,
if (emission > CLOSURE_WEIGHT_CUTOFF) {
float3 emission_color = stack_load_float3(stack, emission_color_offset);
emission_setup(sd, rgb_to_spectrum(emission * emission_color));
emission_setup(
sd, rgb_to_spectrum(emission * emission_color * object_volume_density(kg, sd->object)));
}
if (blackbody > CLOSURE_WEIGHT_CUTOFF) {
@ -1080,14 +1081,15 @@ ccl_device_noinline int svm_node_principled_volume(KernelGlobals kg,
float3 blackbody_tint = stack_load_float3(stack, node.w);
float3 bb = blackbody_tint * intensity *
rec709_to_rgb(kg, svm_math_blackbody_color_rec709(T));
emission_setup(sd, rgb_to_spectrum(bb));
emission_setup(sd, rgb_to_spectrum(bb * object_volume_density(kg, sd->object)));
}
}
#endif
return offset;
}
ccl_device_noinline void svm_node_closure_emission(ccl_private ShaderData *sd,
ccl_device_noinline void svm_node_closure_emission(KernelGlobals kg,
ccl_private ShaderData *sd,
ccl_private float *stack,
Spectrum closure_weight,
uint4 node)
@ -1105,6 +1107,10 @@ ccl_device_noinline void svm_node_closure_emission(ccl_private ShaderData *sd,
weight *= mix_weight;
}
if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
weight *= object_volume_density(kg, sd->object);
}
emission_setup(sd, weight);
}

@ -255,7 +255,7 @@ ccl_device void svm_eval_nodes(KernelGlobals kg,
SVM_CASE(NODE_CLOSURE_EMISSION)
IF_KERNEL_NODES_FEATURE(EMISSION)
{
svm_node_closure_emission(sd, stack, closure_weight, node);
svm_node_closure_emission(kg, sd, stack, closure_weight, node);
}
break;
SVM_CASE(NODE_CLOSURE_BACKGROUND)

@ -1025,6 +1025,8 @@ enum ShaderDataFlag {
SD_EXTINCTION = (1 << 6),
/* Shader has have volume phase (scatter) closure. */
SD_SCATTER = (1 << 7),
/* Shader is being evaluated in a volume. */
SD_IS_VOLUME_SHADER_EVAL = (1 << 8),
/* Shader has transparent closure. */
SD_TRANSPARENT = (1 << 9),
/* BSDF requires LCG for evaluation. */
@ -1035,8 +1037,8 @@ enum ShaderDataFlag {
SD_RAY_PORTAL = (1 << 12),
SD_CLOSURE_FLAGS = (SD_EMISSION | SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSSRDF | SD_HOLDOUT |
SD_EXTINCTION | SD_SCATTER | SD_BSDF_NEEDS_LCG | SD_BSDF_HAS_TRANSMISSION |
SD_RAY_PORTAL),
SD_EXTINCTION | SD_SCATTER | SD_IS_VOLUME_SHADER_EVAL | SD_BSDF_NEEDS_LCG |
SD_BSDF_HAS_TRANSMISSION | SD_RAY_PORTAL),
/* Shader flags. */