Eevee: Prepare for fullres tracing
This commit is contained in:
parent
aa5c543a7f
commit
5a7c3d5a08
|
@ -43,6 +43,7 @@ static struct {
|
|||
struct GPUShader *maxz_downdepth_sh;
|
||||
struct GPUShader *minz_downdepth_layer_sh;
|
||||
struct GPUShader *maxz_downdepth_layer_sh;
|
||||
struct GPUShader *maxz_copydepth_layer_sh;
|
||||
struct GPUShader *minz_copydepth_sh;
|
||||
struct GPUShader *maxz_copydepth_sh;
|
||||
|
||||
|
@ -109,6 +110,11 @@ static void eevee_create_shader_downsample(void)
|
|||
datatoc_effect_minmaxz_frag_glsl,
|
||||
"#define MAX_PASS\n"
|
||||
"#define LAYERED\n");
|
||||
e_data.maxz_copydepth_layer_sh = DRW_shader_create_fullscreen(
|
||||
datatoc_effect_minmaxz_frag_glsl,
|
||||
"#define MAX_PASS\n"
|
||||
"#define COPY_DEPTH\n"
|
||||
"#define LAYERED\n");
|
||||
e_data.minz_copydepth_sh = DRW_shader_create_fullscreen(
|
||||
datatoc_effect_minmaxz_frag_glsl,
|
||||
"#define MIN_PASS\n"
|
||||
|
@ -194,9 +200,12 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
|
|||
/**
|
||||
* MinMax Pyramid
|
||||
*/
|
||||
int size[2];
|
||||
size[0] = max_ii(size_fs[0] / 2, 1);
|
||||
size[1] = max_ii(size_fs[1] / 2, 1);
|
||||
const bool half_res_hiz = true;
|
||||
int size[2], div;
|
||||
common_data->hiz_mip_offset = (half_res_hiz) ? 1 : 0;
|
||||
div = (half_res_hiz) ? 2 : 1;
|
||||
size[0] = max_ii(size_fs[0] / div, 1);
|
||||
size[1] = max_ii(size_fs[1] / div, 1);
|
||||
|
||||
if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) {
|
||||
/* Intel gpu seems to have problem rendering to only depth format */
|
||||
|
@ -214,16 +223,12 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
|
|||
* Compute Mipmap texel alignement.
|
||||
*/
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
float mip_size[2] = {viewport_size[0], viewport_size[1]};
|
||||
for (int j = 0; j < i; ++j) {
|
||||
mip_size[0] = floorf(fmaxf(1.0f, mip_size[0] / 2.0f));
|
||||
mip_size[1] = floorf(fmaxf(1.0f, mip_size[1] / 2.0f));
|
||||
}
|
||||
common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, floorf(log2f(floorf(viewport_size[0] / mip_size[0])))));
|
||||
common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, floorf(log2f(floorf(viewport_size[1] / mip_size[1])))));
|
||||
int mip_size[2];
|
||||
GPU_texture_get_mipmap_size(txl->color, i, mip_size);
|
||||
common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, i));
|
||||
common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, i));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Normal buffer for deferred passes.
|
||||
*/
|
||||
|
@ -357,6 +362,13 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
|
|||
grp = DRW_shgroup_create(e_data.maxz_copydepth_sh, psl->maxz_copydepth_ps);
|
||||
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
|
||||
DRW_shgroup_call_add(grp, quad, NULL);
|
||||
|
||||
psl->maxz_copydepth_layer_ps = DRW_pass_create(
|
||||
"HiZ Max Copy DepthLayer Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS);
|
||||
grp = DRW_shgroup_create(e_data.maxz_copydepth_layer_sh, psl->maxz_copydepth_layer_ps);
|
||||
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
|
||||
DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1);
|
||||
DRW_shgroup_call_add(grp, quad, NULL);
|
||||
}
|
||||
|
||||
if ((effects->enabled_effects & EFFECT_VELOCITY_BUFFER) != 0) {
|
||||
|
@ -425,16 +437,30 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int l
|
|||
GPU_framebuffer_recursive_downsample(fbl->downsample_fb, stl->g_data->minzbuffer, 8, &min_downsample_cb, vedata);
|
||||
DRW_stats_group_end();
|
||||
#endif
|
||||
int minmax_size[2], depth_size[2];
|
||||
GPU_texture_get_mipmap_size(depth_src, 0, depth_size);
|
||||
GPU_texture_get_mipmap_size(txl->maxzbuffer, 0, minmax_size);
|
||||
bool is_full_res_minmaxz = (minmax_size[0] == depth_size[0] && minmax_size[1] == depth_size[1]);
|
||||
|
||||
DRW_stats_group_start("Max buffer");
|
||||
/* Copy depth buffer to max texture top level */
|
||||
GPU_framebuffer_texture_attach(fbl->downsample_fb, txl->maxzbuffer, 0, 0);
|
||||
GPU_framebuffer_bind(fbl->downsample_fb);
|
||||
if (layer >= 0) {
|
||||
DRW_draw_pass(psl->maxz_downdepth_layer_ps);
|
||||
if (is_full_res_minmaxz) {
|
||||
DRW_draw_pass(psl->maxz_copydepth_layer_ps);
|
||||
}
|
||||
else {
|
||||
DRW_draw_pass(psl->maxz_downdepth_layer_ps);
|
||||
}
|
||||
}
|
||||
else {
|
||||
DRW_draw_pass(psl->maxz_downdepth_ps);
|
||||
if (is_full_res_minmaxz) {
|
||||
DRW_draw_pass(psl->maxz_copydepth_ps);
|
||||
}
|
||||
else {
|
||||
DRW_draw_pass(psl->maxz_downdepth_ps);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create lower levels */
|
||||
|
@ -552,6 +578,7 @@ void EEVEE_effects_free(void)
|
|||
DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_layer_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_layer_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_layer_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.minz_copydepth_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_sh);
|
||||
}
|
||||
|
|
|
@ -243,6 +243,7 @@ typedef struct EEVEE_PassList {
|
|||
struct DRWPass *maxz_downdepth_layer_ps;
|
||||
struct DRWPass *minz_copydepth_ps;
|
||||
struct DRWPass *maxz_copydepth_ps;
|
||||
struct DRWPass *maxz_copydepth_layer_ps;
|
||||
|
||||
struct DRWPass *depth_pass;
|
||||
struct DRWPass *depth_pass_cull;
|
||||
|
@ -651,6 +652,8 @@ typedef struct EEVEE_CommonUniformBuffer {
|
|||
int prb_irradiance_vis_size; /* int */
|
||||
float prb_lod_cube_max; /* float */
|
||||
float prb_lod_planar_max; /* float */
|
||||
/* Misc */
|
||||
int hiz_mip_offset; /* int */
|
||||
} EEVEE_CommonUniformBuffer;
|
||||
|
||||
/* ***************** CLIP PLANES DATA **************** */
|
||||
|
|
|
@ -60,8 +60,9 @@ vec2 get_ao_dir(float jitter)
|
|||
|
||||
void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h)
|
||||
{
|
||||
co1 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
|
||||
co2 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
|
||||
int mip = int(lod) + hizMipOffset;
|
||||
co1 *= mipRatio[mip].xyxy;
|
||||
co2 *= mipRatio[mip].xyxy;
|
||||
|
||||
float depth1 = textureLod(maxzBuffer, co1.xy, floor(lod)).r;
|
||||
float depth2 = textureLod(maxzBuffer, co1.zw, floor(lod)).r;
|
||||
|
|
|
@ -36,6 +36,8 @@ layout(std140) uniform common_block {
|
|||
int prbIrradianceVisSize;
|
||||
float prbLodCubeMax;
|
||||
float prbLodPlanarMax;
|
||||
/* Misc*/
|
||||
int hizMipOffset;
|
||||
};
|
||||
|
||||
/* aoParameters */
|
||||
|
|
|
@ -9,10 +9,7 @@ float sample_depth(vec2 uv, int index, float lod)
|
|||
else {
|
||||
#endif
|
||||
/* Correct UVs for mipmaping mis-alignment */
|
||||
/* + 1.0 because we are using half res maxzBuffer
|
||||
* and mipRatio starts at on mip 0. */
|
||||
int mip = int(lod + 1.0);
|
||||
uv *= mipRatio[mip];
|
||||
uv *= mipRatio[int(lod) + hizMipOffset];
|
||||
return textureLod(maxzBuffer, uv, lod).r;
|
||||
#ifdef PLANAR_PROBE_RAYTRACE
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue