EEVEE Next: Ambient Occlusion #108398

Merged
Miguel Pozo merged 29 commits from pragma37/blender:pull-eevee-next-ao into main 2023-06-30 19:37:37 +02:00
5 changed files with 27 additions and 22 deletions
Showing only changes of commit 746dc746c1 - Show all commits

View File

@ -105,13 +105,12 @@ class Film {
int cryptomatte_layer_max_get() const;
int cryptomatte_layer_len_get() const;
/** WARNING: Film and RenderBuffers use different storage types for AO and Shadow. */
static ePassStorageType pass_storage_type(eViewLayerEEVEEPassType pass_type)
{
switch (pass_type) {
case EEVEE_RENDER_PASS_Z:
case EEVEE_RENDER_PASS_MIST:
case EEVEE_RENDER_PASS_SHADOW:
case EEVEE_RENDER_PASS_AO:
return PASS_STORAGE_VALUE;
case EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT:
case EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET:
@ -124,19 +123,8 @@ class Film {
static bool pass_is_float3(eViewLayerEEVEEPassType pass_type)
{
switch (pass_type) {
case EEVEE_RENDER_PASS_NORMAL:
case EEVEE_RENDER_PASS_DIFFUSE_LIGHT:
case EEVEE_RENDER_PASS_DIFFUSE_COLOR:
case EEVEE_RENDER_PASS_SPECULAR_LIGHT:
case EEVEE_RENDER_PASS_SPECULAR_COLOR:
case EEVEE_RENDER_PASS_VOLUME_LIGHT:
case EEVEE_RENDER_PASS_EMIT:
case EEVEE_RENDER_PASS_ENVIRONMENT:
return true;
default:
return false;
}
return pass_storage_type(pass_type) == PASS_STORAGE_COLOR &&
pass_type != EEVEE_RENDER_PASS_COMBINED;
}
/* Returns layer offset in the accumulation texture. -1 if the pass is not enabled. */

View File

@ -448,9 +448,8 @@ void Instance::update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view
CHECK_PASS_EEVEE(VOLUME_LIGHT, SOCK_RGBA, 3, "RGB");
CHECK_PASS_LEGACY(EMIT, SOCK_RGBA, 3, "RGB");
CHECK_PASS_LEGACY(ENVIRONMENT, SOCK_RGBA, 3, "RGB");
/* TODO: CHECK_PASS_LEGACY(SHADOW, SOCK_RGBA, 3, "RGB");
* CHECK_PASS_LEGACY(AO, SOCK_RGBA, 3, "RGB");
* When available they should be converted from Value textures to RGB. */
CHECK_PASS_LEGACY(SHADOW, SOCK_RGBA, 3, "RGB");
CHECK_PASS_LEGACY(AO, SOCK_RGBA, 3, "RGB");
LISTBASE_FOREACH (ViewLayerAOV *, aov, &view_layer->aovs) {
if ((aov->flag & AOV_CONFLICT) != 0) {

View File

@ -33,8 +33,8 @@ void RenderBuffers::sync()
auto pass_index_get = [&](eViewLayerEEVEEPassType pass_type, int dependent_passes = 0) {
if (enabled_passes & (pass_type | dependent_passes)) {
return inst_.film.pass_storage_type(pass_type) == PASS_STORAGE_COLOR ? data.color_len++ :
data.value_len++;
return pass_storage_type(pass_type) == PASS_STORAGE_COLOR ? data.color_len++ :
data.value_len++;
}
return -1;
};

View File

@ -40,6 +40,24 @@ class RenderBuffers {
public:
RenderBuffers(Instance &inst) : inst_(inst){};
/** WARNING: RenderBuffers and Film use different storage types for AO and Shadow. */
static ePassStorageType pass_storage_type(eViewLayerEEVEEPassType pass_type)
{
switch (pass_type) {
case EEVEE_RENDER_PASS_Z:
case EEVEE_RENDER_PASS_MIST:
case EEVEE_RENDER_PASS_SHADOW:
case EEVEE_RENDER_PASS_AO:
return PASS_STORAGE_VALUE;
case EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT:
case EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET:
case EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL:
return PASS_STORAGE_CRYPTOMATTE;
default:
return PASS_STORAGE_COLOR;
}
}
void sync();
/* Acquires (also ensures) the render buffer before rendering to them. */

View File

@ -717,8 +717,8 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth
film_store_color(dst, film_buf.diffuse_color_id, diffuse_color_accum, out_color);
film_store_color(dst, film_buf.specular_color_id, specular_color_accum, out_color);
film_store_color(dst, film_buf.environment_id, environment_accum, out_color);
film_store_value(dst, film_buf.shadow_id, shadow_accum, out_color);
film_store_value(dst, film_buf.ambient_occlusion_id, ao_accum, out_color);
film_store_color(dst, film_buf.shadow_id, vec4(vec3(shadow_accum), 1.0), out_color);
film_store_color(dst, film_buf.ambient_occlusion_id, vec4(vec3(ao_accum), 1.0), out_color);
film_store_value(dst, film_buf.mist_id, mist_accum, out_color);
}