Dynamic Rendering
Objective: Ensure the base project uses dynamic rendering and understand how to verify it using RenderDoc.
In dynamic rendering, we no longer create a VkRenderPass or VkFrameBuffer; instead we begin rendering with vkCmdBeginRenderingKHR, specifying attachments on-the-fly. This makes our code more flexible (no need to predeclare subpasses) and is now the "modern" way to render in Vulkan.
Task 1: Check the setup for dynamic rendering
In the provided code base, locate the initialization of the graphics pipeline:
/* TASK01: Check the setup for dynamic rendering
 *
 * This new struct replaces what previously was the render pass in the pipeline creation.
 * Note how this structure is now linked in .pNext below, and .renderPass is not used.
 */
vk::PipelineRenderingCreateInfo pipelineRenderingCreateInfo{
    .colorAttachmentCount = 1,
    .pColorAttachmentFormats = &swapChainImageFormat,
    .depthAttachmentFormat = depthFormat
};
vk::GraphicsPipelineCreateInfo pipelineInfo{
    .pNext = &pipelineRenderingCreateInfo,
    .stageCount = 2,
    .pStages = shaderStages,
    .pVertexInputState = &vertexInputInfo,
    .pInputAssemblyState = &inputAssembly,
    .pViewportState = &viewportState,
    .pRasterizationState = &rasterizer,
    .pMultisampleState = &multisampling,
    .pDepthStencilState = &depthStencil,
    .pColorBlendState = &colorBlending,
    .pDynamicState = &dynamicState,
    .layout = pipelineLayout,
    .renderPass = nullptr
};
graphicsPipeline = vk::raii::Pipeline(device, nullptr, pipelineInfo);
And later on, the command buffer recording where we begin rendering:
/* TASK01: Check the setup for dynamic rendering
 *
 * With dynamic rendering, we specify the image view and load/store operations directly
 * in the vk::RenderingAttachmentInfo structure.
 * This approach eliminates the need for explicit render pass and framebuffer objects,
 * simplifying the code and providing flexibility to change attachments at runtime.
 */
vk::RenderingAttachmentInfo colorAttachmentInfo = {
    .imageView = swapChainImageViews[imageIndex],
    .imageLayout = vk::ImageLayout::eColorAttachmentOptimal,
    .loadOp = vk::AttachmentLoadOp::eClear,
    .storeOp = vk::AttachmentStoreOp::eStore,
    .clearValue = clearColor
};
vk::RenderingAttachmentInfo depthAttachmentInfo = {
    .imageView = depthImageView,
    .imageLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal,
    .loadOp = vk::AttachmentLoadOp::eClear,
    .storeOp = vk::AttachmentStoreOp::eDontCare,
    .clearValue = clearDepth
};
// The vk::RenderingInfo structure combines these attachments with other rendering parameters.
vk::RenderingInfo renderingInfo = {
    .renderArea = { .offset = { 0, 0 }, .extent = swapChainExtent },
    .layerCount = 1,
    .colorAttachmentCount = 1,
    .pColorAttachments = &colorAttachmentInfo,
    .pDepthAttachment = &depthAttachmentInfo
};
// Note: .beginRendering replaces the previous .beginRenderPass call.
commandBuffers[currentFrame].beginRendering(renderingInfo);
For more context, refer to the previous tutorial chapter.
Dynamic rendering with RenderDoc
Use RenderDoc to launch the application and capture a frame:
- 
Specify executable path:
Vulkan-Tutorial\attachments\build\38_ray_tracing\Debug\38_ray_tracing.exe. - 
Specify working directory:
Vulkan-Tutorial\attachments\build\38_ray_tracing. - 
Launch the application.
 
In the Event Browser, you should see the calls that confirm that dynamic rendering is set up correctly:
- 
vkCmdBeginRenderingKHRandvkCmdEndRenderingKHR. - 
VkRenderingInfoKHRreplacing the old render pass/framebuffer concept. - 
Color (and depth) attachments set via
VkRenderingAttachmentInfo. 
In RenderDoc’s Texture Viewer, you can inspect the color and depth attachments at various points:
Dynamic rendering reduces CPU overhead and, with the VK_KHR_dynamic_rendering_local_read extension, lets you do subpass-style tile-local reads without full render passes. This is great for techniques like deferred shading on tilers, where reading from a previous pass’s attachment can be done on-tile without extra memory bandwidth. While we won’t implement a deferred renderer here, be aware of this benefit for mobile.
 | 
After this step, you should be comfortable that dynamic rendering is set up correctly. We can now move on to ray tracing features.
Navigation
- 
Previous: Overview
 - 
Next: Acceleration structures