Fix T79718: Eevee OpenVDB render error when frames miss part of the grids

This commit is contained in:
Brecht Van Lommel 2020-08-12 16:31:52 +02:00
parent bff91b32aa
commit 6f502136c7
Notes: blender-bot 2023-02-14 04:39:18 +01:00
Referenced by issue #80332, Principle Volume in World Shader is not working
Referenced by issue #79718, OpenVDB only renders inside Density-Bounds
1 changed files with 7 additions and 2 deletions

View File

@ -66,6 +66,7 @@ static struct {
GPUTexture *dummy_density;
GPUTexture *dummy_color;
GPUTexture *dummy_flame;
GPUTexture *dummy_missing;
GPUTexture *dummy_scatter;
GPUTexture *dummy_transmit;
@ -154,6 +155,9 @@ static void eevee_create_shader_volumes(void)
const float flame = 0.0f;
e_data.dummy_flame = DRW_texture_create_3d(1, 1, 1, GPU_R8, DRW_TEX_WRAP, &flame);
const float missing[4] = {0.0f, 0.0f, 0.0f, 0.0f};
e_data.dummy_missing = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, missing);
}
void EEVEE_volumes_set_jitter(EEVEE_ViewLayerData *sldata, uint current_sample)
@ -374,7 +378,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
/* Fix principle volumetric not working with world materials. */
ListBase gpu_grids = GPU_material_volume_grids(mat);
LISTBASE_FOREACH (GPUMaterialVolumeGrid *, gpu_grid, &gpu_grids) {
DRW_shgroup_uniform_texture(grp, gpu_grid->sampler_name, e_data.dummy_density);
DRW_shgroup_uniform_texture(grp, gpu_grid->sampler_name, e_data.dummy_missing);
}
DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]);
@ -462,7 +466,7 @@ static bool eevee_volume_object_grids_init(Object *ob, ListBase *gpu_grids, DRWS
NULL;
DRW_shgroup_uniform_texture(
grp, gpu_grid->sampler_name, (drw_grid) ? drw_grid->texture : e_data.dummy_density);
grp, gpu_grid->sampler_name, (drw_grid) ? drw_grid->texture : e_data.dummy_missing);
if (drw_grid && multiple_transforms) {
/* Specify per-volume transform matrix that is applied after the
@ -857,6 +861,7 @@ void EEVEE_volumes_free(void)
DRW_TEXTURE_FREE_SAFE(e_data.dummy_density);
DRW_TEXTURE_FREE_SAFE(e_data.dummy_flame);
DRW_TEXTURE_FREE_SAFE(e_data.dummy_color);
DRW_TEXTURE_FREE_SAFE(e_data.dummy_missing);
DRW_SHADER_FREE_SAFE(e_data.volumetric_clear_sh);
DRW_SHADER_FREE_SAFE(e_data.scatter_sh);