diff options
author | Jeroen Bakker <jeroen@blender.org> | 2020-09-07 09:19:09 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-09-07 09:21:41 +0300 |
commit | 7170f7a0414ecded72fba3ef69e28be2be148291 (patch) | |
tree | d98075a0c6695f8ddb9f85fc5f728a5e837c2d1c /source/blender/draw/engines/eevee/eevee_volumes.c | |
parent | 267b8e1a5c322c87d9684638cc29c984c6d33e58 (diff) |
EEVEE: Shaders tests
This will add the remaining static shaders to the eevee shader test suite.
- Downsampling
- GGX LUT generation
- Mist
- Motion Blur
- Ambient Occlusion
- Render Passes
- Screen Raytracing
- Shadows
- Subsurface
- Volumes
Reviewed By: Clément Foucault
Differential Revision: https://developer.blender.org/D8779
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_volumes.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_volumes.c | 100 |
1 files changed, 12 insertions, 88 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 3caca0275c3..85c7c89934c 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -50,13 +50,6 @@ #include "eevee_private.h" static struct { - struct GPUShader *volumetric_clear_sh; - struct GPUShader *scatter_sh; - struct GPUShader *scatter_with_lights_sh; - struct GPUShader *volumetric_integration_sh; - struct GPUShader *volumetric_resolve_sh; - struct GPUShader *volumetric_accum_sh; - GPUTexture *depth_src; GPUTexture *dummy_zero; @@ -70,72 +63,8 @@ static struct { ListBase smoke_domains; } e_data = {NULL}; /* Engine data */ -extern char datatoc_bsdf_common_lib_glsl[]; -extern char datatoc_common_uniforms_lib_glsl[]; -extern char datatoc_common_view_lib_glsl[]; -extern char datatoc_octahedron_lib_glsl[]; -extern char datatoc_cubemap_lib_glsl[]; -extern char datatoc_irradiance_lib_glsl[]; -extern char datatoc_lights_lib_glsl[]; -extern char datatoc_volumetric_accum_frag_glsl[]; -extern char datatoc_volumetric_frag_glsl[]; -extern char datatoc_volumetric_geom_glsl[]; -extern char datatoc_volumetric_vert_glsl[]; -extern char datatoc_volumetric_resolve_frag_glsl[]; -extern char datatoc_volumetric_scatter_frag_glsl[]; -extern char datatoc_volumetric_integration_frag_glsl[]; -extern char datatoc_volumetric_lib_glsl[]; -extern char datatoc_common_fullscreen_vert_glsl[]; - -#define USE_VOLUME_OPTI \ - (GLEW_ARB_shader_image_load_store && GLEW_ARB_shading_language_420pack && \ - !GPU_crappy_amd_driver()) - -static void eevee_create_shader_volumes(void) +static void eevee_create_textures_volumes(void) { - DRWShaderLibrary *lib = EEVEE_shader_lib_get(); - - e_data.volumetric_clear_sh = DRW_shader_create_with_shaderlib(datatoc_volumetric_vert_glsl, - datatoc_volumetric_geom_glsl, - datatoc_volumetric_frag_glsl, - lib, - SHADER_DEFINES - "#define VOLUMETRICS\n" - "#define CLEAR\n"); - - e_data.scatter_sh = DRW_shader_create_with_shaderlib(datatoc_volumetric_vert_glsl, - datatoc_volumetric_geom_glsl, - datatoc_volumetric_scatter_frag_glsl, - lib, - SHADER_DEFINES - "#define VOLUMETRICS\n" - "#define VOLUME_SHADOW\n"); - - e_data.scatter_with_lights_sh = DRW_shader_create_with_shaderlib( - datatoc_volumetric_vert_glsl, - datatoc_volumetric_geom_glsl, - datatoc_volumetric_scatter_frag_glsl, - lib, - SHADER_DEFINES - "#define VOLUMETRICS\n" - "#define VOLUME_LIGHTING\n" - "#define VOLUME_SHADOW\n"); - - e_data.volumetric_integration_sh = DRW_shader_create_with_shaderlib( - datatoc_volumetric_vert_glsl, - datatoc_volumetric_geom_glsl, - datatoc_volumetric_integration_frag_glsl, - lib, - USE_VOLUME_OPTI ? "#extension GL_ARB_shader_image_load_store: enable\n" - "#extension GL_ARB_shading_language_420pack: enable\n" - "#define USE_VOLUME_OPTI\n" SHADER_DEFINES : - SHADER_DEFINES); - - e_data.volumetric_resolve_sh = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_volumetric_resolve_frag_glsl, lib, SHADER_DEFINES); - e_data.volumetric_accum_sh = DRW_shader_create_fullscreen_with_shaderlib( - datatoc_volumetric_accum_frag_glsl, lib, SHADER_DEFINES); - const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f}; e_data.dummy_zero = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, zero); @@ -312,9 +241,9 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) Scene *scene = draw_ctx->scene; DRWShadingGroup *grp = NULL; - /* Shaders */ - if (!e_data.scatter_sh) { - eevee_create_shader_volumes(); + /* Textures */ + if (!e_data.dummy_zero) { + eevee_create_textures_volumes(); } /* Quick breakdown of the Volumetric rendering: @@ -382,7 +311,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) if (grp == NULL) { /* If no world or volume material is present just clear the buffer with this drawcall */ - grp = DRW_shgroup_create(e_data.volumetric_clear_sh, psl->volumetric_world_ps); + grp = DRW_shgroup_create(EEVEE_shaders_volumes_clear_sh_get(), psl->volumetric_world_ps); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); @@ -644,7 +573,8 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) struct GPUShader *sh; DRW_PASS_CREATE(psl->volumetric_scatter_ps, DRW_STATE_WRITE_COLOR); - sh = (common_data->vol_use_lights) ? e_data.scatter_with_lights_sh : e_data.scatter_sh; + sh = (common_data->vol_use_lights) ? EEVEE_shaders_volumes_scatter_with_lights_sh_get() : + EEVEE_shaders_volumes_scatter_sh_get(); grp = DRW_shgroup_create(sh, psl->volumetric_scatter_ps); DRW_shgroup_uniform_texture_ref(grp, "irradianceGrid", &lcache->grid_tx.tex); DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool); @@ -664,7 +594,8 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); DRW_PASS_CREATE(psl->volumetric_integration_ps, DRW_STATE_WRITE_COLOR); - grp = DRW_shgroup_create(e_data.volumetric_integration_sh, psl->volumetric_integration_ps); + grp = DRW_shgroup_create(EEVEE_shaders_volumes_integration_sh_get(), + psl->volumetric_integration_ps); DRW_shgroup_uniform_texture_ref(grp, "volumeScattering", &txl->volume_scatter); DRW_shgroup_uniform_texture_ref(grp, "volumeExtinction", &txl->volume_transmit); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); @@ -675,7 +606,7 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) grp, NULL, USE_VOLUME_OPTI ? 1 : common_data->vol_tex_size[2]); DRW_PASS_CREATE(psl->volumetric_resolve_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM); - grp = DRW_shgroup_create(e_data.volumetric_resolve_sh, psl->volumetric_resolve_ps); + grp = DRW_shgroup_create(EEVEE_shaders_volumes_resolve_sh_get(), psl->volumetric_resolve_ps); DRW_shgroup_uniform_texture_ref(grp, "inScattering", &txl->volume_scatter); DRW_shgroup_uniform_texture_ref(grp, "inTransmittance", &txl->volume_transmit); DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src); @@ -859,13 +790,6 @@ void EEVEE_volumes_free(void) DRW_TEXTURE_FREE_SAFE(e_data.dummy_zero); DRW_TEXTURE_FREE_SAFE(e_data.dummy_one); DRW_TEXTURE_FREE_SAFE(e_data.dummy_flame); - - DRW_SHADER_FREE_SAFE(e_data.volumetric_clear_sh); - DRW_SHADER_FREE_SAFE(e_data.scatter_sh); - DRW_SHADER_FREE_SAFE(e_data.scatter_with_lights_sh); - DRW_SHADER_FREE_SAFE(e_data.volumetric_integration_sh); - DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh); - DRW_SHADER_FREE_SAFE(e_data.volumetric_accum_sh); } /* -------------------------------------------------------------------- */ @@ -905,7 +829,7 @@ void EEVEE_volumes_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRW_PASS_CREATE(psl->volumetric_accum_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); DRWShadingGroup *grp = NULL; if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) { - grp = DRW_shgroup_create(e_data.volumetric_resolve_sh, psl->volumetric_accum_ps); + grp = DRW_shgroup_create(EEVEE_shaders_volumes_resolve_sh_get(), psl->volumetric_accum_ps); DRW_shgroup_uniform_texture_ref(grp, "inScattering", &txl->volume_scatter); DRW_shgroup_uniform_texture_ref(grp, "inTransmittance", &txl->volume_transmit); DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src); @@ -915,7 +839,7 @@ void EEVEE_volumes_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, else { /* There is no volumetrics in the scene. Use a shader to fill the accum textures with a default * value. */ - grp = DRW_shgroup_create(e_data.volumetric_accum_sh, psl->volumetric_accum_ps); + grp = DRW_shgroup_create(EEVEE_shaders_volumes_accum_sh_get(), psl->volumetric_accum_ps); } DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); } |