Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_volumes.c
| Show First 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | |||||
| extern char datatoc_volumetric_geom_glsl[]; | extern char datatoc_volumetric_geom_glsl[]; | ||||
| extern char datatoc_volumetric_vert_glsl[]; | extern char datatoc_volumetric_vert_glsl[]; | ||||
| extern char datatoc_volumetric_resolve_frag_glsl[]; | extern char datatoc_volumetric_resolve_frag_glsl[]; | ||||
| extern char datatoc_volumetric_scatter_frag_glsl[]; | extern char datatoc_volumetric_scatter_frag_glsl[]; | ||||
| extern char datatoc_volumetric_integration_frag_glsl[]; | extern char datatoc_volumetric_integration_frag_glsl[]; | ||||
| extern char datatoc_volumetric_lib_glsl[]; | extern char datatoc_volumetric_lib_glsl[]; | ||||
| extern char datatoc_common_fullscreen_vert_glsl[]; | extern char datatoc_common_fullscreen_vert_glsl[]; | ||||
| #define USE_VOLUME_OPTI (GLEW_ARB_shader_image_load_store && GLEW_ARB_shading_language_420pack) | |||||
| static void eevee_create_shader_volumes(void) | static void eevee_create_shader_volumes(void) | ||||
| { | { | ||||
| e_data.volumetric_common_lib = BLI_string_joinN(datatoc_common_view_lib_glsl, | e_data.volumetric_common_lib = BLI_string_joinN(datatoc_common_view_lib_glsl, | ||||
| datatoc_common_uniforms_lib_glsl, | datatoc_common_uniforms_lib_glsl, | ||||
| datatoc_bsdf_common_lib_glsl, | datatoc_bsdf_common_lib_glsl, | ||||
| datatoc_volumetric_lib_glsl); | datatoc_volumetric_lib_glsl); | ||||
| e_data.volumetric_common_lights_lib = BLI_string_joinN(datatoc_common_view_lib_glsl, | e_data.volumetric_common_lights_lib = BLI_string_joinN(datatoc_common_view_lib_glsl, | ||||
| Show All 25 Lines | e_data.scatter_with_lights_sh = DRW_shader_create_with_lib(datatoc_volumetric_vert_glsl, | ||||
| "#define VOLUMETRICS\n" | "#define VOLUMETRICS\n" | ||||
| "#define VOLUME_LIGHTING\n" | "#define VOLUME_LIGHTING\n" | ||||
| "#define VOLUME_SHADOW\n"); | "#define VOLUME_SHADOW\n"); | ||||
| e_data.volumetric_integration_sh = DRW_shader_create_with_lib( | e_data.volumetric_integration_sh = DRW_shader_create_with_lib( | ||||
| datatoc_volumetric_vert_glsl, | datatoc_volumetric_vert_glsl, | ||||
| datatoc_volumetric_geom_glsl, | datatoc_volumetric_geom_glsl, | ||||
| datatoc_volumetric_integration_frag_glsl, | datatoc_volumetric_integration_frag_glsl, | ||||
| e_data.volumetric_common_lib, | e_data.volumetric_common_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" : | |||||
| NULL); | NULL); | ||||
| e_data.volumetric_resolve_sh = DRW_shader_create_with_lib(datatoc_common_fullscreen_vert_glsl, | e_data.volumetric_resolve_sh = DRW_shader_create_with_lib(datatoc_common_fullscreen_vert_glsl, | ||||
| NULL, | NULL, | ||||
| datatoc_volumetric_resolve_frag_glsl, | datatoc_volumetric_resolve_frag_glsl, | ||||
| e_data.volumetric_common_lib, | e_data.volumetric_common_lib, | ||||
| NULL); | NULL); | ||||
| float color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | float color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | ||||
| e_data.dummy_density = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, color); | e_data.dummy_density = DRW_texture_create_3d(1, 1, 1, GPU_RGBA8, DRW_TEX_WRAP, color); | ||||
| ▲ Show 20 Lines • Show All 369 Lines • ▼ Show 20 Lines | if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) { | ||||
| DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); | DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); | ||||
| DRW_PASS_CREATE(psl->volumetric_integration_ps, DRW_STATE_WRITE_COLOR); | 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(e_data.volumetric_integration_sh, psl->volumetric_integration_ps); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "volumeScattering", &txl->volume_scatter); | DRW_shgroup_uniform_texture_ref(grp, "volumeScattering", &txl->volume_scatter); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "volumeExtinction", &txl->volume_transmit); | DRW_shgroup_uniform_texture_ref(grp, "volumeExtinction", &txl->volume_transmit); | ||||
| DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | ||||
| DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); | DRW_shgroup_call_procedural_triangles( | ||||
| 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); | 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(e_data.volumetric_resolve_sh, psl->volumetric_resolve_ps); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "inScattering", &txl->volume_scatter); | 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, "inTransmittance", &txl->volume_transmit); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src); | DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src); | ||||
| DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | ||||
| ▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) { | ||||
| GPU_framebuffer_bind(fbl->volumetric_fb); | GPU_framebuffer_bind(fbl->volumetric_fb); | ||||
| DRW_draw_pass(psl->volumetric_world_ps); | DRW_draw_pass(psl->volumetric_world_ps); | ||||
| DRW_draw_pass(psl->volumetric_objects_ps); | DRW_draw_pass(psl->volumetric_objects_ps); | ||||
| GPU_framebuffer_bind(fbl->volumetric_scat_fb); | GPU_framebuffer_bind(fbl->volumetric_scat_fb); | ||||
| DRW_draw_pass(psl->volumetric_scatter_ps); | DRW_draw_pass(psl->volumetric_scatter_ps); | ||||
| if (USE_VOLUME_OPTI) { | |||||
| int tex_scatter = GPU_texture_opengl_bindcode(txl->volume_scatter_history); | |||||
| int tex_transmit = GPU_texture_opengl_bindcode(txl->volume_transmit_history); | |||||
| /* TODO(fclem) Encapsulate these GL calls into DRWManager. */ | |||||
| glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); | |||||
| /* Subtility here! we need to tell the GL that the texture is layered (GL_TRUE) | |||||
| * in order to bind the full 3D texture and not just a 2D slice. */ | |||||
| glBindImageTexture(0, tex_scatter, 0, GL_TRUE, 0, GL_WRITE_ONLY, GL_R11F_G11F_B10F); | |||||
| glBindImageTexture(1, tex_transmit, 0, GL_TRUE, 0, GL_WRITE_ONLY, GL_R11F_G11F_B10F); | |||||
| GPU_framebuffer_bind(fbl->volumetric_fb); | |||||
| } | |||||
| else { | |||||
| GPU_framebuffer_bind(fbl->volumetric_integ_fb); | GPU_framebuffer_bind(fbl->volumetric_integ_fb); | ||||
| } | |||||
| DRW_draw_pass(psl->volumetric_integration_ps); | DRW_draw_pass(psl->volumetric_integration_ps); | ||||
| if (USE_VOLUME_OPTI) { | |||||
| glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); | |||||
| glBindImageTexture(0, 0, 0, GL_TRUE, 0, GL_WRITE_ONLY, GL_R11F_G11F_B10F); | |||||
| glBindImageTexture(1, 0, 0, GL_TRUE, 0, GL_WRITE_ONLY, GL_R11F_G11F_B10F); | |||||
| } | |||||
| SWAP(struct GPUFrameBuffer *, fbl->volumetric_scat_fb, fbl->volumetric_integ_fb); | SWAP(struct GPUFrameBuffer *, fbl->volumetric_scat_fb, fbl->volumetric_integ_fb); | ||||
| SWAP(GPUTexture *, txl->volume_scatter, txl->volume_scatter_history); | SWAP(GPUTexture *, txl->volume_scatter, txl->volume_scatter_history); | ||||
| SWAP(GPUTexture *, txl->volume_transmit, txl->volume_transmit_history); | SWAP(GPUTexture *, txl->volume_transmit, txl->volume_transmit_history); | ||||
| effects->volume_scatter = txl->volume_scatter; | effects->volume_scatter = txl->volume_scatter; | ||||
| effects->volume_transmit = txl->volume_transmit; | effects->volume_transmit = txl->volume_transmit; | ||||
| /* Restore */ | /* Restore */ | ||||
| ▲ Show 20 Lines • Show All 53 Lines • Show Last 20 Lines | |||||