Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-10-24 15:49:00 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-10-27 23:49:15 +0300
commit66d8f82b832b58cba3273c0a4196fae6db0e1efd (patch)
tree682a3aba8fbd23ccd72a4e4f2a02fb36ad0a0d01 /source/blender/draw/engines/eevee/eevee_materials.c
parent1c0c63ce5b3914be2d0828260e5ac777a7596d36 (diff)
Eevee: Overhaul the volumetric system.
The system now uses several 3D textures in order to decouple every steps of the volumetric rendering. See https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite for more details. On the technical side, instead of using a compute shader to populate the 3D textures we use layered rendering with a geometry shader to render 1 fullscreen triangle per 3D texture slice.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_materials.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c52
1 files changed, 7 insertions, 45 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 98dbef8e445..b555761d5df 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -43,26 +43,6 @@
#include "eevee_lut.h"
#include "eevee_private.h"
-#if defined(IRRADIANCE_SH_L2)
-#define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-#define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-#define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
-#endif
-
-#define SHADER_DEFINES \
- "#define EEVEE_ENGINE\n" \
- "#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
- "#define MAX_GRID " STRINGIFY(MAX_GRID) "\n" \
- "#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n" \
- "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \
- "#define MAX_SHADOW " STRINGIFY(MAX_SHADOW) "\n" \
- "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
- "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
- "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
- SHADER_IRRADIANCE
-
/* *********** STATIC *********** */
static struct {
char *frag_shader_lib;
@@ -105,7 +85,10 @@ extern char datatoc_shadow_geom_glsl[];
extern char datatoc_lightprobe_geom_glsl[];
extern char datatoc_lightprobe_vert_glsl[];
extern char datatoc_background_vert_glsl[];
+extern char datatoc_volumetric_vert_glsl[];
+extern char datatoc_volumetric_geom_glsl[];
extern char datatoc_volumetric_frag_glsl[];
+extern char datatoc_volumetric_lib_glsl[];
extern Material defmaterial;
extern GlobalsUboStorage ts;
@@ -332,7 +315,7 @@ static char *eevee_get_defines(int options)
return str;
}
-static char *eevee_get_volume_defines(int options)
+static char *eevee_get_volume_defines(int UNUSED(options))
{
char *str = NULL;
@@ -340,19 +323,6 @@ static char *eevee_get_volume_defines(int options)
BLI_dynstr_appendf(ds, SHADER_DEFINES);
BLI_dynstr_appendf(ds, "#define VOLUMETRICS\n");
- if ((options & VAR_VOLUME_SHADOW) != 0) {
- BLI_dynstr_appendf(ds, "#define VOLUME_SHADOW\n");
- }
- if ((options & VAR_VOLUME_HOMO) != 0) {
- BLI_dynstr_appendf(ds, "#define VOLUME_HOMOGENEOUS\n");
- }
- if ((options & VAR_VOLUME_LIGHT) != 0) {
- BLI_dynstr_appendf(ds, "#define VOLUME_LIGHTING\n");
- }
- if ((options & VAR_VOLUME_COLOR) != 0) {
- BLI_dynstr_appendf(ds, "#define COLOR_TRANSMITTANCE\n");
- }
-
str = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
@@ -516,6 +486,7 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl);
BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl);
BLI_dynstr_append(ds_frag, datatoc_lamps_lib_glsl);
+ BLI_dynstr_append(ds_frag, datatoc_volumetric_lib_glsl);
BLI_dynstr_append(ds_frag, datatoc_volumetric_frag_glsl);
e_data.volume_shader_lib = BLI_dynstr_get_cstring(ds_frag);
BLI_dynstr_free(ds_frag);
@@ -617,20 +588,11 @@ struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, Wor
SHADER_DEFINES "#define WORLD_BACKGROUND\n");
}
-struct GPUMaterial *EEVEE_material_world_volume_get(
- struct Scene *scene, World *wo,
- bool use_lights, bool use_volume_shadows, bool is_homogeneous, bool use_color_transmit, int shadow_method)
+struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *wo)
{
const void *engine = &DRW_engine_viewport_eevee_type;
int options = VAR_WORLD_VOLUME;
- if (use_lights) options |= VAR_VOLUME_LIGHT;
- if (is_homogeneous) options |= VAR_VOLUME_HOMO;
- if (use_volume_shadows) options |= VAR_VOLUME_SHADOW;
- if (use_color_transmit) options |= VAR_VOLUME_COLOR;
-
- options |= eevee_material_shadow_option(shadow_method);
-
GPUMaterial *mat = GPU_material_from_nodetree_find(&wo->gpumaterial, engine, options);
if (mat != NULL) {
return mat;
@@ -640,7 +602,7 @@ struct GPUMaterial *EEVEE_material_world_volume_get(
mat = GPU_material_from_nodetree(
scene, wo->nodetree, &wo->gpumaterial, engine, options,
- datatoc_background_vert_glsl, NULL, e_data.volume_shader_lib,
+ datatoc_volumetric_vert_glsl, datatoc_volumetric_geom_glsl, e_data.volume_shader_lib,
defines);
MEM_freeN(defines);