Fix T43926: Volume scatter: intersecting objects GPU rendering artifacts

Fix T44007: Cycles Volumetrics: block artifacts with overlapping volumes

The issue was caused by uninitialized parameters of some closures, which
lead to unpredictable behavior of shader_merge_closures().
This commit is contained in:
Sergey Sharybin 2015-03-23 12:48:33 +05:00
parent 572489ec89
commit ed7e593a4b
Notes: blender-bot 2023-02-14 09:23:51 +01:00
Referenced by issue #44007, Cycles Volumetrics: block artifacts with overlapping volumes
Referenced by issue #43926, Volume scatter: intersecting objects GPU rendering artifacts
9 changed files with 17 additions and 2 deletions

View File

@ -39,6 +39,7 @@ ccl_device int bsdf_ashikhmin_velvet_setup(ShaderClosure *sc)
{
float sigma = fmaxf(sc->data0, 0.01f);
sc->data0 = 1.0f/(sigma * sigma); /* m_invsigma2 */
sc->data1 = 0.0f;
sc->type = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID;

View File

@ -40,6 +40,8 @@ CCL_NAMESPACE_BEGIN
ccl_device int bsdf_diffuse_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_DIFFUSE_ID;
sc->data0 = 0.0f;
sc->data1 = 0.0f;
return SD_BSDF|SD_BSDF_HAS_EVAL;
}
@ -83,6 +85,8 @@ ccl_device int bsdf_diffuse_sample(const ShaderClosure *sc, float3 Ng, float3 I,
ccl_device int bsdf_translucent_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_TRANSLUCENT_ID;
sc->data0 = 0.0f;
sc->data1 = 0.0f;
return SD_BSDF|SD_BSDF_HAS_EVAL;
}

View File

@ -52,6 +52,8 @@ ccl_device float3 bsdf_diffuse_ramp_get_color(const ShaderClosure *sc, const flo
ccl_device int bsdf_diffuse_ramp_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_DIFFUSE_RAMP_ID;
sc->data0 = 0.0f;
sc->data1 = 0.0f;
return SD_BSDF|SD_BSDF_HAS_EVAL;
}

View File

@ -51,9 +51,9 @@ ccl_device float3 bsdf_phong_ramp_get_color(const ShaderClosure *sc, const float
ccl_device int bsdf_phong_ramp_setup(ShaderClosure *sc)
{
sc->data0 = max(sc->data0, 0.0f);
sc->type = CLOSURE_BSDF_PHONG_RAMP_ID;
sc->data0 = max(sc->data0, 0.0f);
sc->data1 = 0.0f;
return SD_BSDF|SD_BSDF_HAS_EVAL;
}

View File

@ -40,6 +40,8 @@ CCL_NAMESPACE_BEGIN
ccl_device int bsdf_reflection_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_REFLECTION_ID;
sc->data0 = 0.0f;
sc->data1 = 0.0f;
return SD_BSDF;
}

View File

@ -40,6 +40,8 @@ CCL_NAMESPACE_BEGIN
ccl_device int bsdf_refraction_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_REFRACTION_ID;
sc->data0 = 0.0f;
sc->data1 = 0.0f;
return SD_BSDF;
}

View File

@ -38,6 +38,8 @@ CCL_NAMESPACE_BEGIN
ccl_device int bsdf_transparent_setup(ShaderClosure *sc)
{
sc->type = CLOSURE_BSDF_TRANSPARENT_ID;
sc->data0 = 0.0f;
sc->data1 = 0.0f;
return SD_BSDF|SD_TRANSPARENT;
}

View File

@ -30,6 +30,7 @@ ccl_device int bssrdf_setup(ShaderClosure *sc, ClosureType type)
return flag;
}
else {
sc->data0 = 0.0f;
sc->data1 = clamp(sc->data1, 0.0f, 1.0f); /* texture blur */
sc->T.x = clamp(sc->T.x, 0.0f, 1.0f); /* sharpness */
sc->type = type;

View File

@ -35,6 +35,7 @@ ccl_device int volume_henyey_greenstein_setup(ShaderClosure *sc)
/* clamp anisotropy to avoid delta function */
sc->data0 = signf(sc->data0) * min(fabsf(sc->data0), 1.0f - 1e-3f);
sc->data1 = 0.0f;
return SD_SCATTER;
}