[Bf-blender-cvs] [f301c2f38ed] tmp-eevee-aov: EEVEE: Add support for material AOVs

Jeroen Bakker noreply at git.blender.org
Wed Sep 23 17:21:55 CEST 2020


Commit: f301c2f38ed4d94e13f3d180e0cde69263f33485
Author: Jeroen Bakker
Date:   Wed Sep 23 16:32:20 2020 +0200
Branches: tmp-eevee-aov
https://developer.blender.org/rBf301c2f38ed4d94e13f3d180e0cde69263f33485

EEVEE: Add support for material AOVs

During rendering up to 8 AOVs are supported. The implementation in D7010
used to many resources and was limitted. In this implementation the
resources are 1 accum texture and 1 ubo of 48 bytes per AOV to render so
we could remove this limitation.

Not supported yet is world shader AOV's. This could become the next
target.

===================================================================

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee/eevee_renderpasses.c
M	source/blender/draw/engines/eevee/shaders/renderpass_postprocess_frag.glsl
M	source/blender/nodes/shader/node_shader_tree.c
M	source/blender/nodes/shader/nodes/node_shader_output_aov.c
M	source/blender/render/intern/source/render_result.c

===================================================================

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 0cf0a99c326..cfac87abcd0 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -165,9 +165,12 @@ def object_cycles_shader_nodes_poll(context):
             cycles_shader_nodes_poll(context))
 
 
-def cycles_aov_node_poll(context):
-    return (object_cycles_shader_nodes_poll(context) or
-            world_shader_nodes_poll(context))
+def eevee_cycles_aov_node_poll(context):
+    if (cycles_shader_nodes_poll(context)):
+        return object_shader_nodes_poll(context) or world_shader_nodes_poll(context)
+    if (eevee_cycles_shader_nodes_poll(context)):
+        return object_shader_nodes_poll(context)
+    return False;
 
 
 def object_eevee_shader_nodes_poll(context):
@@ -210,7 +213,7 @@ shader_node_categories = [
     ShaderNodeCategory("SH_NEW_OUTPUT", "Output", items=[
         NodeItem("ShaderNodeOutputMaterial", poll=object_eevee_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeOutputLight", poll=object_cycles_shader_nodes_poll),
-        NodeItem("ShaderNodeOutputAOV", poll=cycles_aov_node_poll),
+        NodeItem("ShaderNodeOutputAOV", poll=eevee_cycles_aov_node_poll),
         NodeItem("ShaderNodeOutputWorld", poll=world_shader_nodes_poll),
         NodeItem("ShaderNodeOutputLineStyle", poll=line_style_shader_nodes_poll),
         NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 5c4ee015c86..47068d0b843 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -240,6 +240,9 @@ void EEVEE_view_layer_data_free(void *storage)
   DRW_UBO_FREE_SAFE(sldata->renderpass_ubo.spec_light);
   DRW_UBO_FREE_SAFE(sldata->renderpass_ubo.emit);
   DRW_UBO_FREE_SAFE(sldata->renderpass_ubo.environment);
+  for (int aov_index = 0; aov_index < MAX_AOVS; aov_index++) {
+    DRW_UBO_FREE_SAFE(sldata->renderpass_ubo.aovs[aov_index]);
+  }
 
   if (sldata->material_cache) {
     BLI_memblock_destroy(sldata->material_cache, NULL);
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 3b525ba0742..12469c738e4 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -24,6 +24,7 @@
 
 #include "BLI_alloca.h"
 #include "BLI_ghash.h"
+#include "BLI_hash.h"
 #include "BLI_listbase.h"
 #include "BLI_math_bits.h"
 #include "BLI_memblock.h"
@@ -244,38 +245,70 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
     /* Create RenderPass UBO */
     if (sldata->renderpass_ubo.combined == NULL) {
       EEVEE_RenderPassData data;
-      data = (EEVEE_RenderPassData){true, true, true, true, true, false, false};
+      data = (EEVEE_RenderPassData){true, true, true, true, true, false, false, false, 0};
       sldata->renderpass_ubo.combined = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.combined");
 
-      data = (EEVEE_RenderPassData){true, false, false, false, false, true, false};
+      data = (EEVEE_RenderPassData){true, false, false, false, false, true, false, false, 0};
       sldata->renderpass_ubo.diff_color = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.diff_color");
 
-      data = (EEVEE_RenderPassData){true, true, false, false, false, false, false};
+      data = (EEVEE_RenderPassData){true, true, false, false, false, false, false, false, 0};
       sldata->renderpass_ubo.diff_light = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.diff_light");
 
-      data = (EEVEE_RenderPassData){false, false, true, false, false, false, false};
+      data = (EEVEE_RenderPassData){false, false, true, false, false, false, false, false, 0};
       sldata->renderpass_ubo.spec_color = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.spec_color");
 
-      data = (EEVEE_RenderPassData){false, false, true, true, false, false, false};
+      data = (EEVEE_RenderPassData){false, false, true, true, false, false, false, false, 0};
       sldata->renderpass_ubo.spec_light = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.spec_light");
 
-      data = (EEVEE_RenderPassData){false, false, false, false, true, false, false};
+      data = (EEVEE_RenderPassData){false, false, false, false, true, false, false, false, 0};
       sldata->renderpass_ubo.emit = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.emit");
 
-      data = (EEVEE_RenderPassData){true, true, true, true, true, false, true};
+      data = (EEVEE_RenderPassData){true, true, true, true, true, false, true, false, 0};
       sldata->renderpass_ubo.environment = GPU_uniformbuf_create_ex(
           sizeof(data), &data, "renderpass_ubo.environment");
+
+      for (int aov_index = 0; aov_index < MAX_AOVS; aov_index++) {
+        data = (EEVEE_RenderPassData){false, false, false, false, false, false, false, true, 0};
+        sldata->renderpass_ubo.aovs[aov_index] = GPU_uniformbuf_create_ex(
+            sizeof(data), &data, "renderpass_ubo.aovs");
+      }
     }
 
     /* Used combined pass by default. */
     g_data->renderpass_ubo = sldata->renderpass_ubo.combined;
 
+    {
+      g_data->num_aovs_used = 0;
+      if ((stl->g_data->render_passes & EEVEE_RENDER_PASS_AOV) != 0) {
+        EEVEE_RenderPassData data = {false, false, false, false, false, false, false, true, 0};
+        if (stl->g_data->aov_name_hash == EEVEE_AOV_HASH_ALL) {
+          ViewLayer *view_layer = draw_ctx->view_layer;
+          int aov_index = 0;
+          LISTBASE_FOREACH (ViewLayerAOV *, aov, &view_layer->aovs) {
+            if (aov_index == MAX_AOVS) {
+              break;
+            }
+            int aov_name_hash = BLI_hash_string(aov->name);
+            data.renderPassAOVActive = aov_name_hash;
+            GPU_uniformbuf_update(sldata->renderpass_ubo.aovs[aov_index], &data);
+            aov_index++;
+          }
+          g_data->num_aovs_used = aov_index;
+        }
+        else {
+          data.renderPassAOVActive = stl->g_data->aov_name_hash;
+          GPU_uniformbuf_update(sldata->renderpass_ubo.aovs[0], &data);
+          g_data->num_aovs_used = 1;
+        }
+      }
+    }
+
     /* HACK: EEVEE_material_get can create a new context. This can only be
      * done when there is no active framebuffer. We do this here otherwise
      * `EEVEE_renderpasses_output_init` will fail. It cannot be done in
@@ -950,6 +983,9 @@ void EEVEE_material_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata,
   if (pd->render_passes & EEVEE_RENDER_PASS_SPECULAR_COLOR) {
     material_renderpass_init(fbl, &txl->spec_color_accum, texture_format, do_clear);
   }
+  if (pd->render_passes & EEVEE_RENDER_PASS_AOV) {
+    material_renderpass_init(fbl, &txl->aov_surface_accum[0], texture_format, do_clear);
+  }
   if (pd->render_passes & EEVEE_RENDER_PASS_SPECULAR_LIGHT) {
     material_renderpass_init(fbl, &txl->spec_light_accum, texture_format, do_clear);
 
@@ -1016,6 +1052,15 @@ void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
         EEVEE_reflection_output_accumulate(sldata, vedata);
       }
     }
+    if (pd->render_passes & EEVEE_RENDER_PASS_AOV) {
+      for (int aov_index = 0; aov_index < pd->num_aovs_used; aov_index++) {
+        material_renderpass_accumulate(fbl,
+                                       material_accum_ps,
+                                       pd,
+                                       txl->aov_surface_accum[aov_index],
+                                       sldata->renderpass_ubo.aovs[aov_index]);
+      }
+    }
 
     /* Restore default. */
     pd->renderpass_ubo = sldata->renderpass_ubo.combined;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 6aca5944053..dd76f8040b0 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -163,7 +163,9 @@ BLI_INLINE bool eevee_hdri_preview_overlay_enabled(const View3D *v3d)
 #define EEVEE_RENDERPASSES_MATERIAL \
   (EEVEE_RENDER_PASS_EMIT | EEVEE_RENDER_PASS_DIFFUSE_COLOR | EEVEE_RENDER_PASS_DIFFUSE_LIGHT | \
    EEVEE_RENDER_PASS_SPECULAR_COLOR | EEVEE_RENDER_PASS_SPECULAR_LIGHT | \
-   EEVEE_RENDER_PASS_ENVIRONMENT)
+   EEVEE_RENDER_PASS_ENVIRONMENT | EEVEE_RENDER_PASS_AOV)
+#define EEVEE_AOV_HASH_ALL -1
+#define MAX_AOVS 8
 
 /* Material shader variations */
 enum {
@@ -376,6 +378,7 @@ typedef struct EEVEE_TextureList {
   struct GPUTexture *diff_light_accum;
   struct GPUTexture *spec_color_accum;
   struct GPUTexture *spec_light_accum;
+  struct GPUTexture *aov_surface_accum[MAX_AOVS];
   struct GPUTexture *emit_accum;
   struct GPUTexture *bloom_accum;
   struct GPUTexture *ssr_accum;
@@ -861,6 +864,7 @@ typedef struct EEVEE_ViewLayerData {
     struct GPUUniformBuf *spec_color;
     struct GPUUniformBuf *spec_light;
     struct GPUUniformBuf *emit;
+    struct GPUUniformBuf *aovs[MAX_AOVS];
   } renderpass_ubo;
 
   /* Common Uniform Buffer */
@@ -960,7 +964,8 @@ typedef struct EEVEE_PrivateData {
   /* Renderpasses */
   /* Bitmask containing the active render_passes */
   eViewLayerEEVEEPassType render_passes;
-  int aov_hash;
+  int aov_name_hash;
+  int num_aovs_used;
 
   /* Uniform references that are referenced inside the `renderpass_pass`. They are updated
    * to reuse the drawing pass and the shading group. */
@@ -1287,7 +1292,8 @@ void EEVEE_renderpasses_output_accumulate(EEVEE_ViewLayerData *sldata,
                                           bool post_effect);
 void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *sldata,
                                     EEVEE_Data *vedata,
-                                    eViewLayerEEVEEPassType renderpass_type);
+                                    eViewLayerEEVEEPassType renderpass_type,
+                                    int aov_index);
 void EEVEE_renderpasses_draw(EEVEE_Vi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list