Fix T51553: Cycles Volume Emission turns black when strength is 0 or color is black

The problem was that Cycles implicitly uses a transparent surface shader when only
volume nodes are used, but since the black emission shader gets optimized away,
it was no longer detected and therefore no transparent surface was used.

Therefore, the shader now stores whether volume nodes were connected before
optimizing.
This commit is contained in:
Lukas Stockner 2017-05-19 04:59:35 +02:00
parent cf1127f380
commit 4a04d7ae89
Notes: blender-bot 2023-02-14 06:38:15 +01:00
Referenced by issue #52560, Cycles Rendering Discrepancy
2 changed files with 16 additions and 4 deletions

View File

@ -241,6 +241,10 @@ void Shader::set_graph(ShaderGraph *graph_)
delete graph_bump;
graph = graph_;
graph_bump = NULL;
/* Store info here before graph optimization to make sure that
* nodes that get optimized away still count. */
has_volume_connected = (graph->output()->input("Volume")->link != NULL);
}
void Shader::tag_update(Scene *scene)
@ -432,15 +436,14 @@ void ShaderManager::device_update_common(Device *device,
flag |= SD_HAS_VOLUME;
has_volumes = true;
/* in this case we can assume transparent surface */
if(!shader->has_surface)
flag |= SD_HAS_ONLY_VOLUME;
/* todo: this could check more fine grained, to skip useless volumes
* enclosed inside an opaque bsdf.
*/
flag |= SD_HAS_TRANSPARENT_SHADOW;
}
/* in this case we can assume transparent surface */
if(shader->has_volume_connected && !shader->has_surface)
flag |= SD_HAS_ONLY_VOLUME;
if(shader->heterogeneous_volume && shader->has_volume_spatial_varying)
flag |= SD_HETEROGENEOUS_VOLUME;
if(shader->has_bssrdf_bump)

View File

@ -105,6 +105,15 @@ public:
bool need_update;
bool need_update_attributes;
/* If the shader has only volume components, the surface is assumed to
* be transparent.
* However, graph optimization might remove the volume subgraph, but
* since the user connected something to the volume output the surface
* should still be transparent.
* Therefore, has_volume_connected stores whether some volume subtree
* was connected before optimization. */
bool has_volume_connected;
/* information about shader after compiling */
bool has_surface;
bool has_surface_emission;