[Bf-blender-cvs] [d63d2c8b9ea] temp-xr-virtual-camera-experiment: Use Material flag to identify virtual camera.

Jeroen Bakker noreply at git.blender.org
Wed Nov 9 12:18:29 CET 2022


Commit: d63d2c8b9ea151750d38a391dc1083992b5d53c8
Author: Jeroen Bakker
Date:   Wed Nov 9 12:18:22 2022 +0100
Branches: temp-xr-virtual-camera-experiment
https://developer.blender.org/rBd63d2c8b9ea151750d38a391dc1083992b5d53c8

Use Material flag to identify virtual camera.

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

M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/intern/draw_manager_data.cc
M	source/blender/gpu/GPU_material.h
M	source/blender/gpu/intern/gpu_codegen.cc
M	source/blender/gpu/intern/gpu_node_graph.c
M	source/blender/gpu/shaders/material/gpu_shader_material_virtual_camera.glsl
M	source/blender/nodes/shader/nodes/node_shader_virtual_camera.cc

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index b134d7f6dc6..afb84f48bee 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -861,6 +861,17 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata,
               continue;
             }
 
+            /* Virtual cameras can only be used in the main scene. This needs to be a different
+             * DRW_state.*/
+            printf("%s: %d %d\n",
+                   __func__,
+                   DRW_state_is_opengl_render(),
+                   GPU_material_flag_get(gpumat_array[i], GPU_MATFLAG_VIRTUAL_CAMERA));
+            if (DRW_state_is_opengl_render() &&
+                GPU_material_flag_get(gpumat_array[i], GPU_MATFLAG_VIRTUAL_CAMERA)) {
+              continue;
+            }
+
             /* Do not render surface if we are rendering a volume object
              * and do not have a surface closure. */
             if (use_volume_material &&
diff --git a/source/blender/draw/intern/draw_manager_data.cc b/source/blender/draw/intern/draw_manager_data.cc
index bae99a945d2..6183cf41a41 100644
--- a/source/blender/draw/intern/draw_manager_data.cc
+++ b/source/blender/draw/intern/draw_manager_data.cc
@@ -1836,7 +1836,7 @@ void DRW_shgroup_add_material_resources(DRWShadingGroup *grp, GPUMaterial *mater
           grp, tex->sampler_name, *tex->sky, eGPUSamplerState(tex->sampler_state));
     }
     else if (tex->camera) {
-      /* Sky */
+      /* VirtualCamera */
       DRW_shgroup_uniform_texture_ex(
           grp, tex->sampler_name, *tex->camera, eGPUSamplerState(tex->sampler_state));
     }
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 48eb53d662f..0457b6bb9f2 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -83,6 +83,8 @@ typedef enum eGPUMaterialFlag {
   GPU_MATFLAG_OBJECT_INFO = (1 << 10),
   GPU_MATFLAG_AOV = (1 << 11),
 
+  GPU_MATFLAG_VIRTUAL_CAMERA = (1 << 12),
+
   GPU_MATFLAG_BARYCENTRIC = (1 << 20),
 
   /* Optimization to only add the branches of the principled shader that are necessary. */
diff --git a/source/blender/gpu/intern/gpu_codegen.cc b/source/blender/gpu/intern/gpu_codegen.cc
index 2ce03f88693..aa0f86d46e4 100644
--- a/source/blender/gpu/intern/gpu_codegen.cc
+++ b/source/blender/gpu/intern/gpu_codegen.cc
@@ -394,7 +394,7 @@ void GPUCodegen::generate_resources()
     }
     else if (tex->camera) {
       const char *name = info.name_buffer.append_sampler_name(tex->sampler_name);
-      info.sampler(0, ImageType::FLOAT_2D, name, Frequency::PASS);
+      info.sampler(0, ImageType::FLOAT_2D, name, Frequency::BATCH);
     }
     else if (tex->tiled_mapping_name[0] != '\0') {
       const char *name = info.name_buffer.append_sampler_name(tex->sampler_name);
diff --git a/source/blender/gpu/intern/gpu_node_graph.c b/source/blender/gpu/intern/gpu_node_graph.c
index 553ca219617..81b9d373951 100644
--- a/source/blender/gpu/intern/gpu_node_graph.c
+++ b/source/blender/gpu/intern/gpu_node_graph.c
@@ -498,6 +498,7 @@ static GPUMaterialTexture *gpu_node_graph_add_texture(GPUNodeGraph *graph,
     }
     tex->colorband = colorband;
     tex->sky = sky;
+    tex->camera = camera;
     tex->sampler_state = sampler_state;
     BLI_snprintf(tex->sampler_name, sizeof(tex->sampler_name), "samp%d", num_textures);
     if (ELEM(link_type, GPU_NODE_LINK_IMAGE_TILED, GPU_NODE_LINK_IMAGE_TILED_MAPPING)) {
@@ -637,12 +638,11 @@ GPUNodeLink *GPU_image_camera(GPUMaterial *mat, Camera *camera, eGPUSamplerState
 {
   GPUNodeGraph *graph = gpu_material_node_graph(mat);
   GPUNodeLink *link = gpu_node_link_create();
-  GPUTexture *texture = camera->runtime.virtual_camera_stage ?
-                            NULL :
-                            GPU_offscreen_color_texture(camera->runtime.virtual_display_texture);
+  GPUTexture *texture = GPU_offscreen_color_texture(camera->runtime.virtual_display_texture);
   link->link_type = GPU_NODE_LINK_IMAGE_CAMERA;
   link->texture = gpu_node_graph_add_texture(
       graph, NULL, NULL, NULL, NULL, &texture, link->link_type, sampler_state);
+  GPU_material_flag_set(mat, GPU_MATFLAG_VIRTUAL_CAMERA);
   return link;
 }
 
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_virtual_camera.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_virtual_camera.glsl
index 26d15292e6a..05bc6f90686 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_virtual_camera.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_virtual_camera.glsl
@@ -4,13 +4,8 @@ void node_virtual_camera_empty(vec3 co, out vec4 color, out float alpha)
   alpha = 0.0;
 }
 
-void node_virtual_camera(vec3 co, sampler2D ima, float mix, out vec4 color, out float alpha)
+void node_virtual_camera(vec3 co, sampler2D ima, out vec4 color, out float alpha)
 {
-  if (mix == 1.0) {
-    node_virtual_camera_empty(co, color, alpha);
-    return;
-  }
-
   color = texture(ima, co.xy);
   alpha = color.a;
 }
diff --git a/source/blender/nodes/shader/nodes/node_shader_virtual_camera.cc b/source/blender/nodes/shader/nodes/node_shader_virtual_camera.cc
index f9af9356242..0220e773839 100644
--- a/source/blender/nodes/shader/nodes/node_shader_virtual_camera.cc
+++ b/source/blender/nodes/shader/nodes/node_shader_virtual_camera.cc
@@ -30,18 +30,10 @@ static int node_shader_gpu_virtual_camera(GPUMaterial *mat,
   Object *orig_object = DEG_get_original_object(object);
 
   Camera *cam = static_cast<Camera *>(orig_object->data);
-  const bool virtual_camera_stage = cam->runtime.virtual_camera_stage;
-  const float stage_mix = virtual_camera_stage ? 1.0f : 0.0f;
-
   node_shader_gpu_default_tex_coord(mat, node, &in[0].link);
 
-  return GPU_stack_link(mat,
-                        node,
-                        "node_virtual_camera",
-                        in,
-                        out,
-                        GPU_image_camera(mat, cam, GPU_SAMPLER_DEFAULT),
-                        GPU_uniform(&stage_mix));
+  return GPU_stack_link(
+      mat, node, "node_virtual_camera", in, out, GPU_image_camera(mat, cam, GPU_SAMPLER_DEFAULT));
 }
 
 }  // namespace blender::nodes::node_shader_virtual_camera_cc



More information about the Bf-blender-cvs mailing list