[Bf-blender-cvs] [b386828671a] blender2.8: Eevee: Do shadow cube render in one pass.
Clément Foucault
noreply at git.blender.org
Thu Apr 20 13:07:58 CEST 2017
Commit: b386828671a40feea026ccefae17560e58e0d440
Author: Clément Foucault
Date: Wed Apr 19 22:07:53 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBb386828671a40feea026ccefae17560e58e0d440
Eevee: Do shadow cube render in one pass.
===================================================================
M source/blender/draw/engines/eevee/eevee.c
M source/blender/draw/engines/eevee/eevee_lights.c
M source/blender/draw/engines/eevee/eevee_private.h
M source/blender/draw/engines/eevee/shaders/shadow_geom.glsl
M source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
===================================================================
diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c
index 77eca9237da..fca7feb2f65 100644
--- a/source/blender/draw/engines/eevee/eevee.c
+++ b/source/blender/draw/engines/eevee/eevee.c
@@ -304,6 +304,18 @@ static DRWShadingGroup *eevee_cube_shgroup(struct GPUShader *sh, DRWPass *pass,
return grp;
}
+static DRWShadingGroup *eevee_cube_shadow_shgroup(EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4])
+{
+ DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cube_pass, geom);
+ DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo, 0);
+ DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
+
+ for (int i = 0; i < 6; ++i)
+ DRW_shgroup_dynamic_call_add_empty(grp);
+
+ return grp;
+}
+
static void EEVEE_cache_init(void *vedata)
{
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
@@ -316,10 +328,14 @@ static void EEVEE_cache_init(void *vedata)
}
{
- 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->shadow_cube_pass = DRW_pass_create("Shadow Cube Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+ }
+
+ {
+ // 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);
}
{
@@ -402,6 +418,7 @@ static void EEVEE_cache_init(void *vedata)
static void EEVEE_cache_populate(void *vedata, Object *ob)
{
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
+ EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
if (ob->type == OB_MESH) {
IDProperty *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
@@ -412,7 +429,8 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob->obmat);
DRW_shgroup_call_add(stl->g_data->default_lit_grp, geom, ob->obmat);
- DRW_shgroup_call_add(stl->g_data->shadow_shgrp, geom, ob->obmat);
+ // DRW_shgroup_call_add(stl->g_data->shadow_shgrp, geom, ob->obmat);
+ eevee_cube_shadow_shgroup(psl, stl, geom, ob->obmat);
}
else if (ob->type == OB_LAMP) {
EEVEE_lights_cache_add(stl, ob);
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 12d8fc2db27..6c694b05e6a 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -56,9 +56,10 @@ void EEVEE_lights_init(EEVEE_StorageList *stl)
sizeof(EEVEE_ShadowCascade) * MAX_SHADOW_CASCADE;
if (!stl->lamps) {
- stl->lamps = MEM_callocN(sizeof(EEVEE_LampsInfo), "EEVEE_LampsInfo");
- stl->light_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_Light) * MAX_LIGHT, NULL);
- stl->shadow_ubo = DRW_uniformbuffer_create(shadow_ubo_size, NULL);
+ stl->lamps = MEM_callocN(sizeof(EEVEE_LampsInfo), "EEVEE_LampsInfo");
+ stl->light_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_Light) * MAX_LIGHT, NULL);
+ stl->shadow_ubo = DRW_uniformbuffer_create(shadow_ubo_size, NULL);
+ stl->shadow_render_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_ShadowRender), NULL);
}
}
@@ -325,6 +326,7 @@ void EEVEE_lights_update(EEVEE_StorageList *stl)
/* this refresh lamps shadow buffers */
void EEVEE_draw_shadows(EEVEE_Data *vedata)
{
+ EEVEE_PassList *psl = vedata->psl;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_LampsInfo *linfo = stl->lamps;
@@ -342,27 +344,30 @@ void EEVEE_draw_shadows(EEVEE_Data *vedata)
for (i = 0; (ob = linfo->shadow_cube_ref[i]) && (i < MAX_SHADOW_CUBE); i++) {
EEVEE_LampEngineData *led = (EEVEE_LampEngineData *)DRW_lamp_engine_data_get(ob, &viewport_eevee_type);
EEVEE_ShadowCubeData *evscd = (EEVEE_ShadowCubeData *)led->sto;
+ EEVEE_ShadowRender *srd = &linfo->shadow_render_data;
+ srd->layer = i;
for (int j = 0; j < 6; ++j) {
- linfo->layer = i * 6 + j;
- copy_m4_m4(linfo->shadowmat, evscd->viewprojmat[j]);
- DRW_draw_pass(vedata->psl->shadow_pass);
+ copy_m4_m4(srd->shadowmat[j], evscd->viewprojmat[j]);
}
+ DRW_uniformbuffer_update(stl->shadow_render_ubo, &linfo->shadow_render_data);
+
+ DRW_draw_pass(psl->shadow_cube_pass);
}
/* Standard Shadow Maps */
- DRW_framebuffer_bind(fbl->shadow_map_fb);
- DRW_framebuffer_clear(false, true, false, NULL, 1.0);
+ // DRW_framebuffer_bind(fbl->shadow_map_fb);
+ // DRW_framebuffer_clear(false, true, false, NULL, 1.0);
- /* Render each shadow to one layer of the array */
- for (i = 0; (ob = linfo->shadow_map_ref[i]) && (i < MAX_SHADOW_MAP); i++) {
- EEVEE_LampEngineData *led = (EEVEE_LampEngineData *)DRW_lamp_engine_data_get(ob, &viewport_eevee_type);
- EEVEE_ShadowMapData *evsmd = (EEVEE_ShadowMapData *)led->sto;
+ // /* Render each shadow to one layer of the array */
+ // for (i = 0; (ob = linfo->shadow_map_ref[i]) && (i < MAX_SHADOW_MAP); i++) {
+ // EEVEE_LampEngineData *led = (EEVEE_LampEngineData *)DRW_lamp_engine_data_get(ob, &viewport_eevee_type);
+ // EEVEE_ShadowMapData *evsmd = (EEVEE_ShadowMapData *)led->sto;
- linfo->layer = i;
- copy_m4_m4(linfo->shadowmat, evsmd->viewprojmat);
- DRW_draw_pass(vedata->psl->shadow_pass);
- }
+ // linfo->layer = i;
+ // copy_m4_m4(linfo->shadowmat, evsmd->viewprojmat);
+ // DRW_draw_pass(vedata->psl->shadow_pass);
+ // }
// DRW_framebuffer_bind(e_data.shadow_cascade_fb);
}
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 8be09091df8..97d78a7ce84 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -35,6 +35,7 @@ struct Object;
typedef struct EEVEE_PassList {
/* Shadows */
struct DRWPass *shadow_pass;
+ struct DRWPass *shadow_cube_pass;
/* Probes */
struct DRWPass *probe_background;
@@ -80,6 +81,7 @@ typedef struct EEVEE_StorageList {
struct EEVEE_LampsInfo *lamps;
struct GPUUniformBuffer *light_ubo;
struct GPUUniformBuffer *shadow_ubo;
+ struct GPUUniformBuffer *shadow_render_ubo;
/* Probes */
struct EEVEE_ProbesInfo *probes;
@@ -114,12 +116,13 @@ typedef struct EEVEE_ShadowCascade {
float far[MAX_CASCADE_NUM];
} EEVEE_ShadowCascade;
-/* ************ LIGHT DATA ************* */
-typedef struct EEVEE_LampsInfo {
- /* For rendering shadows */
- float shadowmat[4][4];
+typedef struct EEVEE_ShadowRender {
+ float shadowmat[6][4][4]; /* World->Lamp->NDC : used to render the shadow map. 6 frustrum for cubemap shadow */
int layer;
+} EEVEE_ShadowRender;
+/* ************ LIGHT DATA ************* */
+typedef struct EEVEE_LampsInfo {
int num_light, cache_num_light;
int num_cube, cache_num_cube;
int num_map, cache_num_map;
@@ -131,6 +134,7 @@ typedef struct EEVEE_LampsInfo {
struct Object *shadow_cascade_ref[MAX_SHADOW_CASCADE];
/* UBO Storage : data used by UBO */
struct EEVEE_Light light_data[MAX_LIGHT];
+ struct EEVEE_ShadowRender shadow_render_data;
struct EEVEE_ShadowCube shadow_cube_data[MAX_SHADOW_CUBE];
struct EEVEE_ShadowMap shadow_map_data[MAX_SHADOW_MAP];
struct EEVEE_ShadowCascade shadow_cascade_data[MAX_SHADOW_CASCADE];
diff --git a/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl b/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl
index 1032fe4e956..3e63032abe3 100644
--- a/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl
+++ b/source/blender/draw/engines/eevee/shaders/shadow_geom.glsl
@@ -2,20 +2,22 @@
layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
-uniform mat4 ShadowMatrix;
-uniform int Layer;
+layout(std140) uniform shadow_render_block {
+ mat4 ShadowMatrix[6];
+ int Layer;
+};
in vec4 vPos[];
+in int face[];
void main() {
- gl_Layer = Layer;
- gl_Position = ShadowMatrix * vPos[0];
- EmitVertex();
- gl_Layer = Layer;
- gl_Position = ShadowMatrix * vPos[1];
- EmitVertex();
- gl_Layer = Layer;
- gl_Position = ShadowMatrix * vPos[2];
- EmitVertex();
+ int f = face[0];
+ gl_Layer = Layer + f;
+
+ for (int v = 0; v < 3; ++v) {
+ gl_Position = ShadowMatrix[f] * vPos[v];
+ EmitVertex();
+ }
+
EndPrimitive();
}
\ No newline at end of file
diff --git a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
index c7f4d4ba777..28470b31a0f 100644
--- a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl
@@ -1,10 +1,12 @@
-uniform mat4 ModelMatrix;
+uniform mat4 ShadowModelMatrix;
in vec3 pos;
out vec4 vPos;
+out int face;
void main() {
- vPos = ModelMatrix * vec4(pos, 1.0);
+ vPos = ShadowModelMatrix * vec4(pos, 1.0);
+ face = gl_InstanceID;
}
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list