Eevee: Add data display for planar reflection.

Maybe not very useful but it's here for feature parity with the other probes.
The fragment shader clipping is here because I'm lazy and don't want to creating a proper quad Batch.
This commit is contained in:
Clément Foucault 2017-06-17 01:59:01 +02:00
parent bd9a328b58
commit 5a029d7a6d
4 changed files with 78 additions and 3 deletions

View File

@ -126,6 +126,8 @@ data_to_c_simple(engines/eevee/shaders/lightprobe_cube_display_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_cube_display_vert.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_grid_display_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_grid_display_vert.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lightprobe_planar_display_vert.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lit_surface_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/lit_surface_vert.glsl SRC)
data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC)

View File

@ -56,6 +56,7 @@ static struct {
struct GPUShader *probe_filter_glossy_sh;
struct GPUShader *probe_filter_diffuse_sh;
struct GPUShader *probe_grid_display_sh;
struct GPUShader *probe_planar_display_sh;
struct GPUShader *probe_cube_display_sh;
struct GPUTexture *hammersley;
@ -71,6 +72,8 @@ extern char datatoc_lightprobe_filter_glossy_frag_glsl[];
extern char datatoc_lightprobe_filter_diffuse_frag_glsl[];
extern char datatoc_lightprobe_geom_glsl[];
extern char datatoc_lightprobe_vert_glsl[];
extern char datatoc_lightprobe_planar_display_frag_glsl[];
extern char datatoc_lightprobe_planar_display_vert_glsl[];
extern char datatoc_lightprobe_cube_display_frag_glsl[];
extern char datatoc_lightprobe_cube_display_vert_glsl[];
extern char datatoc_lightprobe_grid_display_frag_glsl[];
@ -227,6 +230,18 @@ void EEVEE_lightprobes_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *UNUSED(ved
MEM_freeN(shader_str);
ds_frag = BLI_dynstr_new();
BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl);
BLI_dynstr_append(ds_frag, datatoc_lightprobe_planar_display_frag_glsl);
shader_str = BLI_dynstr_get_cstring(ds_frag);
BLI_dynstr_free(ds_frag);
e_data.probe_planar_display_sh = DRW_shader_create(
datatoc_lightprobe_planar_display_vert_glsl, NULL, shader_str,
"#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n");
MEM_freeN(shader_str);
e_data.hammersley = create_hammersley_sample_texture(1024);
}
@ -349,7 +364,8 @@ void EEVEE_lightprobes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *
}
{
psl->probe_display = DRW_pass_create("LightProbe Display", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK;
psl->probe_display = DRW_pass_create("LightProbe Display", state);
struct Batch *geom = DRW_cache_sphere_get();
DRWShadingGroup *grp = stl->g_data->cube_display_shgrp = DRW_shgroup_instance_create(e_data.probe_cube_display_sh, psl->probe_display, geom);
@ -416,7 +432,7 @@ static void scale_m4_v3(float R[4][4], float v[3])
mul_v3_v3(R[i], v);
}
static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata)
static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, EEVEE_TextureList *txl)
{
EEVEE_LightProbesInfo *pinfo = sldata->probes;
Object *ob;
@ -510,6 +526,18 @@ static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata)
float min_dist = min_ff(1.0f - 1e-8f, 1.0f - probe->falloff) * probe->distinf;
eplanar->attenuation_scale = -1.0f / max_ff(1e-8f, max_dist - min_dist);
eplanar->attenuation_bias = max_dist * -eplanar->attenuation_scale;
/* Debug Display */
if ((probe->flag & LIGHTPROBE_FLAG_SHOW_DATA) != 0) {
DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_planar_display_sh, psl->probe_display);
DRW_shgroup_uniform_int(grp, "probeIdx", &ped->probe_id, 1);
DRW_shgroup_uniform_buffer(grp, "probePlanars", &txl->planar_pool);
DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
struct Batch *geom = DRW_cache_fullscreen_quad_get();
DRW_shgroup_call_add(grp, geom, ob->obmat);
}
}
}
@ -706,7 +734,7 @@ void EEVEE_lightprobes_cache_finish(EEVEE_SceneLayerData *sldata, EEVEE_Data *ve
}
EEVEE_lightprobes_updates(sldata, vedata->psl, vedata->stl);
EEVEE_planar_reflections_updates(sldata);
EEVEE_planar_reflections_updates(sldata, vedata->psl, vedata->txl);
DRW_uniformbuffer_update(sldata->probe_ubo, &sldata->probes->probe_data);
DRW_uniformbuffer_update(sldata->grid_ubo, &sldata->probes->grid_data);
@ -1150,6 +1178,7 @@ update_planar:
pinfo->num_planar = tmp_num_planar;
ped->need_update = false;
ped->probe_id = i;
}
}
}
@ -1160,6 +1189,7 @@ void EEVEE_lightprobes_free(void)
DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_grid_display_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_planar_display_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_cube_display_sh);
DRW_TEXTURE_FREE_SAFE(e_data.hammersley);
}

View File

@ -0,0 +1,30 @@
uniform int probeIdx;
uniform sampler2DArray probePlanars;
layout(std140) uniform planar_block {
PlanarData planars_data[MAX_PLANAR];
};
in vec3 worldPosition;
out vec4 FragColor;
void main()
{
PlanarData pd = planars_data[probeIdx];
/* Fancy fast clipping calculation */
vec2 dist_to_clip;
dist_to_clip.x = dot(pd.pl_clip_pos_x, worldPosition);
dist_to_clip.y = dot(pd.pl_clip_pos_y, worldPosition);
float fac = dot(step(pd.pl_clip_edges, dist_to_clip.xxyy), vec2(-1.0, 1.0).xyxy); /* compare and add all tests */
if (fac != 2.0) {
discard;
}
vec4 refco = pd.reflectionmat * vec4(worldPosition, 1.0);
refco.xy /= refco.w;
FragColor = vec4(textureLod(probePlanars, vec3(refco.xy, float(probeIdx)), 0.0).rgb, 1.0);
}

View File

@ -0,0 +1,13 @@
in vec3 pos;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelMatrix;
out vec3 worldPosition;
void main()
{
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz;
}