@@ -115,6 +115,7 @@ class DeferredRenderer : public LineRenderer {
115115
116116 // / Called when the used supersampling mode has changed.
117117 void onSupersamplingModeChanged ();
118+ void onConservativeRasterOptionChanged ();
118119
119120 // Renders the object to the scene framebuffer.
120121 void render () override ;
@@ -204,7 +205,10 @@ class DeferredRenderer : public LineRenderer {
204205 // DeferredRenderingMode::TASK_MESH_SHADER
205206 VISIBILITY_BUFFER_TASK_MESH_SHADER_PASS,
206207 // Resolve/further passes.
207- DEFERRED_RESOLVE_PASS, MOTION_VECTOR_RESOLVE_PASS, HULL_RASTER_PASS, NODE_AABB_PASS
208+ DEFERRED_RESOLVE_PASS, MOTION_VECTOR_RESOLVE_PASS, HULL_RASTER_PASS, NODE_AABB_PASS,
209+
210+ // Conservative rasterization + DeferredRenderingMode::DRAW_INDEXED
211+ VISIBILITY_BUFFER_DRAW_INDEXED_PASS_CONSERVATIVE,
208212 };
209213 int framebufferModeIndex = 0 ;
210214 FramebufferMode framebufferMode = FramebufferMode::VISIBILITY_BUFFER_DRAW_INDEXED_PASS;
@@ -331,10 +335,30 @@ class DeferredRenderer : public LineRenderer {
331335 uint32_t finalWidth = 0 , finalHeight = 0 ;
332336
333337 // Multiple frames can be accumulated with the temporal upscalers to achieve a multisampling effect.
338+ int numSamplesBase = 8 ;
334339 uint32_t jitteredSamplesOffset = 0 ;
335340 uint32_t accumulatedFramesCounter = 0 ;
336341 std::vector<glm::vec2> jitteredSamples;
337342
343+ // For conservative rasterization of the motion vectors (currently only supported for DeferredRenderingMode::DRAW_INDEXED).
344+ bool useConservativeRasterizationMV = false ;
345+ bool useConservativeRasterizationDepth = false ;
346+ bool useConservativeRasterizationPass = false ;
347+ sgl::vk::ImageViewPtr primitiveIndexConservativeImage;
348+ sgl::vk::TexturePtr primitiveIndexConservativeTexture;
349+ sgl::vk::ImageViewPtr depthConservativeRenderTargetImage;
350+ sgl::vk::TexturePtr depthBufferConservativeTexture;
351+ // DeferredRenderingMode::DRAW_INDEXED
352+ std::shared_ptr<VisibilityBufferDrawIndexedPass> visibilityBufferDrawIndexedPassConservative;
353+ // DeferredRenderingMode::DRAW_INDIRECT
354+ std::shared_ptr<VisibilityBufferDrawIndexedIndirectPass> visibilityBufferDrawIndexedIndirectPassesConservative[2 ];
355+ // DeferredRenderingMode::TASK_MESH_SHADER
356+ std::shared_ptr<MeshletTaskMeshPass> meshletTaskMeshPassesConservative[2 ];
357+ // DeferredRenderingMode::BVH_DRAW_INDIRECT
358+ std::shared_ptr<VisibilityBufferBVHDrawIndexedIndirectPass> visibilityBufferBVHDrawIndexedIndirectPassesConservative[2 ];
359+ // DeferredRenderingMode::BVH_MESH_SHADER
360+ std::shared_ptr<MeshletMeshBVHPass> meshletMeshBVHPassesConservative[2 ];
361+
338362 // Data for performance measurements.
339363 int frameCounter = 0 ;
340364 std::string currentStateName;
0 commit comments