[Bf-blender-cvs] [28b597b6df4] blender2.8: Eevee: Material code refactor.
Clément Foucault
noreply at git.blender.org
Sun Jun 4 23:12:07 CEST 2017
Commit: 28b597b6df46b6d2581d7948578922bb3566d242
Author: Clément Foucault
Date: Sun Jun 4 12:12:58 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB28b597b6df46b6d2581d7948578922bb3566d242
Eevee: Material code refactor.
Separate material handling inside another file.
Make use of enums to identify shader variations.
Group all 64*64 LUTs into one array texture.
Only update world probe if world changes.
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/eevee/eevee_engine.c
M source/blender/draw/engines/eevee/eevee_lights.c
M source/blender/draw/engines/eevee/eevee_lut.h
A source/blender/draw/engines/eevee/eevee_materials.c
M source/blender/draw/engines/eevee/eevee_private.h
M source/blender/draw/engines/eevee/eevee_probes.c
M source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
M source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
M source/blender/draw/engines/eevee/shaders/ltc_lib.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a7aabeb4662..ef477f4eb7a 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -83,6 +83,7 @@ set(SRC
engines/eevee/eevee_data.c
engines/eevee/eevee_engine.c
engines/eevee/eevee_lights.c
+ engines/eevee/eevee_materials.c
engines/eevee/eevee_probes.c
engines/eevee/eevee_effects.c
engines/external/external_engine.c
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index ab8923109e9..769edc3503c 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -23,9 +23,8 @@
* \ingroup draw_engine
*/
-#include "DRW_render.h"
-
#include "DNA_world_types.h"
+#include "DRW_render.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
@@ -35,151 +34,11 @@
#include "eevee_engine.h"
#include "eevee_private.h"
-#include "eevee_lut.h"
#define EEVEE_ENGINE "BLENDER_EEVEE"
-#define SHADER_DEFINES \
- "#define EEVEE_ENGINE\n" \
- "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \
- "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
- "#define MAX_SHADOW_MAP " STRINGIFY(MAX_SHADOW_MAP) "\n" \
- "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
- "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n"
-
-/* *********** STATIC *********** */
-static struct {
- char *frag_shader_lib;
-
- struct GPUShader *default_lit;
- struct GPUShader *default_lit_flat;
- struct GPUShader *default_world;
- struct GPUShader *default_background;
- struct GPUShader *depth_sh;
-
- struct GPUShader *probe_filter_sh;
- struct GPUShader *probe_spherical_harmonic_sh;
-
- struct GPUTexture *ltc_mat;
- struct GPUTexture *brdf_lut;
- struct GPUTexture *jitter;
-
- float camera_pos[3];
-} e_data = {NULL}; /* Engine data */
-
-extern char datatoc_default_frag_glsl[];
-extern char datatoc_default_world_frag_glsl[];
-extern char datatoc_ltc_lib_glsl[];
-extern char datatoc_bsdf_lut_frag_glsl[];
-extern char datatoc_bsdf_common_lib_glsl[];
-extern char datatoc_bsdf_direct_lib_glsl[];
-extern char datatoc_bsdf_sampling_lib_glsl[];
-extern char datatoc_lit_surface_frag_glsl[];
-extern char datatoc_lit_surface_vert_glsl[];
-extern char datatoc_shadow_frag_glsl[];
-extern char datatoc_shadow_geom_glsl[];
-extern char datatoc_shadow_vert_glsl[];
-extern char datatoc_probe_filter_frag_glsl[];
-extern char datatoc_probe_sh_frag_glsl[];
-extern char datatoc_probe_geom_glsl[];
-extern char datatoc_probe_vert_glsl[];
-extern char datatoc_background_vert_glsl[];
-
-extern Material defmaterial;
extern GlobalsUboStorage ts;
-static struct GPUTexture *create_jitter_texture(int w, int h)
-{
- struct GPUTexture *tex;
- float (*texels)[2] = MEM_mallocN(sizeof(float[2]) * w * h, "jitter_tex");
- int i;
-
- /* TODO replace by something more evenly distributed like blue noise */
- for (i = 0; i < w * h; i++) {
- texels[i][0] = 2.0f * BLI_frand() - 1.0f;
- texels[i][1] = 2.0f * BLI_frand() - 1.0f;
- normalize_v2(texels[i]);
- }
-
- tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_WRAP, (float *)texels);
- MEM_freeN(texels);
- return tex;
-}
-
-static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
-{
- struct GPUTexture *tex;
-#if 0 /* Used only to generate the LUT values */
- struct GPUFrameBuffer *fb = NULL;
- static float samples_ct = 8192.0f;
- static float inv_samples_ct = 1.0f / 8192.0f;
-
- char *lib_str = NULL;
-
- DynStr *ds_vert = BLI_dynstr_new();
- BLI_dynstr_append(ds_vert, datatoc_bsdf_common_lib_glsl);
- BLI_dynstr_append(ds_vert, datatoc_bsdf_sampling_lib_glsl);
- lib_str = BLI_dynstr_get_cstring(ds_vert);
- BLI_dynstr_free(ds_vert);
-
- struct GPUShader *sh = DRW_shader_create_with_lib(
- datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_bsdf_lut_frag_glsl, lib_str,
- "#define HAMMERSLEY_SIZE 8192\n"
- "#define BRDF_LUT_SIZE 64\n"
- "#define NOISE_SIZE 64\n");
-
- DRWPass *pass = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR);
- DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
- DRW_shgroup_uniform_float(grp, "sampleCount", &samples_ct, 1);
- DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_ct, 1);
- DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley);
- DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter);
-
- struct Batch *geom = DRW_cache_fullscreen_quad_get();
- DRW_shgroup_call_add(grp, geom, NULL);
-
- float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut");
-
- tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_FILTER, (float *)texels);
-
- DRWFboTexture tex_filter = {&tex, DRW_TEX_RG_16, DRW_TEX_FILTER};
- DRW_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1);
-
- DRW_framebuffer_bind(fb);
- DRW_draw_pass(pass);
-
- float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut");
- glReadBuffer(GL_COLOR_ATTACHMENT0);
- glReadPixels(0, 0, w, h, GL_RGB, GL_FLOAT, data);
-
- printf("{");
- for (int i = 0; i < w*h * 3; i+=3) {
- printf("%ff, %ff, ", data[i], data[i+1]); i+=3;
- printf("%ff, %ff, ", data[i], data[i+1]); i+=3;
- printf("%ff, %ff, ", data[i], data[i+1]); i+=3;
- printf("%ff, %ff, \n", data[i], data[i+1]);
- }
- printf("}");
-
- MEM_freeN(texels);
- MEM_freeN(data);
-#else
- float (*texels)[3] = MEM_mallocN(sizeof(float[3]) * 64 * 64, "bsdf lut texels");
-
- for (int i = 0; i < 64 * 64; i++) {
- texels[i][0] = bsdf_split_sum_ggx[i*2 + 0];
- texels[i][1] = bsdf_split_sum_ggx[i*2 + 1];
- texels[i][2] = ltc_mag_ggx[i];
- }
-
- tex = DRW_texture_create_2D(64, 64, DRW_TEX_RGB_16, DRW_TEX_FILTER, (float *)texels);
- MEM_freeN(texels);
-#endif
-
- return tex;
-}
-
-
/* *********** FUNCTIONS *********** */
static void EEVEE_engine_init(void *ved)
@@ -196,247 +55,31 @@ static void EEVEE_engine_init(void *ved)
(int)viewport_size[0], (int)viewport_size[1],
&tex, 1);
- if (!e_data.frag_shader_lib) {
- DynStr *ds_frag = BLI_dynstr_new();
- BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
- 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_lit_surface_frag_glsl);
- e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag);
- BLI_dynstr_free(ds_frag);
- }
-
- if (!e_data.depth_sh) {
- e_data.depth_sh = DRW_shader_create_3D_depth_only();
- }
-
- if (!e_data.default_lit) {
- char *frag_str = NULL;
-
- DynStr *ds_frag = BLI_dynstr_new();
- BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
- BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
- frag_str = BLI_dynstr_get_cstring(ds_frag);
- BLI_dynstr_free(ds_frag);
-
- e_data.default_lit = DRW_shader_create(
- datatoc_lit_surface_vert_glsl, NULL, frag_str, SHADER_DEFINES "#define MESH_SHADER\n");
-
- e_data.default_lit_flat = DRW_shader_create(
- datatoc_lit_surface_vert_glsl, NULL, frag_str,
- SHADER_DEFINES
- "#define MESH_SHADER\n"
- "#define USE_FLAT_NORMAL\n");
-
- MEM_freeN(frag_str);
- }
-
- if (!e_data.default_world) {
- e_data.default_world = DRW_shader_create(
- datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_default_world_frag_glsl, NULL);
- }
-
- if (!e_data.default_background) {
- e_data.default_background = DRW_shader_create_fullscreen(datatoc_default_world_frag_glsl, NULL);
- }
-
- if (!e_data.ltc_mat) {
- e_data.ltc_mat = DRW_texture_create_2D(64, 64, DRW_TEX_RGBA_16, DRW_TEX_FILTER, ltc_mat_ggx);
- }
-
- if (!e_data.jitter) {
- e_data.jitter = create_jitter_texture(64, 64);
- }
-
- if (!e_data.brdf_lut) {
- e_data.brdf_lut = create_ggx_lut_texture(64, 64);
- }
-
- {
- float viewinvmat[4][4];
- DRW_viewport_matrix_get(viewinvmat, DRW_MAT_VIEWINV);
-
- copy_v3_v3(e_data.camera_pos, viewinvmat[3]);
- }
-
+ EEVEE_materials_init();
EEVEE_lights_init(sldata);
-
EEVEE_probes_init(sldata);
-
EEVEE_effects_init(vedata);
-
- // EEVEE_lights_update(stl);
-}
-
-static DRWShadingGroup *eevee_cube_shgroup(struct GPUShader *sh, DRWPass *pass, struct Batch *geom)
-{
- DRWShadingGroup *grp = DRW_shgroup_instance_create(sh, pass, geom);
-
- for (int i = 0; i < 6; ++i)
- DRW_shgroup_call_dynamic_add_empty(grp);
-
- return grp;
}
static void EEVEE_cache_init(void *vedata)
{
- static int zero = 0;
-
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get();
-
if (!stl->g_data) {
/* Alloc transient pointers */
stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
}
- {
- // psl->shadow_pass = DRW_pass_create("Shadow Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
- // stl->g_data->shadow_shgrp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
- // DRW_shgroup_uniform_mat4(stl->g_data->shadow_shgrp, "ShadowMatrix", (float *)stl->lamps->shadowmat);
- // DRW_shgroup_uniform_int(stl->g_data->shadow_shgrp, "Layer", &stl->lamps->layer, 1);
- }
-
- {
- psl->probe_background = DRW_pass_create("Probe Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR);
-
- struct Batch *geom = DRW_cache_fullscreen_quad_get();
- DRWShadingGroup *grp = NULL;
-
- const DRWContextState *draw_ctx = DRW_context_state_get();
- Scene *scene = draw_ctx->scene;
- World *wo = scene->world;
-
- float *col = ts.colorBackground;
- if (wo) {
- col = &wo->horr;
- }
-
- if (wo && wo->use_nodes && wo->nodetree) {
- struct GPUMaterial *gpumat = GPU_material_from_nodetree(
- scene, wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, 0,
- datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib,
- SHADER_DEFINES "#define PROBE_CAPTURE\n");
-
- grp = DRW_shgroup_material_instance_create(gpumat, psl->probe_background, geom);
-
- if (grp) {
- DRW_shgroup_uniform_int(grp, "Layer", &zero, 1);
-
- for (int i = 0; i < 6; ++i)
- DRW_shgroup_call_dynamic_add_empty(grp);
- }
- else {
- /* Shader failed : pink background */
- static float pink[3] = {1.0f,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list