ADD: Selection
This commit is contained in:
@@ -947,6 +947,18 @@ RGImageHandle RenderGraph::import_gbuffer_albedo()
|
||||
return import_image(d);
|
||||
}
|
||||
|
||||
RGImageHandle RenderGraph::import_id_buffer()
|
||||
{
|
||||
RGImportedImageDesc d{};
|
||||
d.name = "idBuffer.objectID";
|
||||
d.image = _context->getSwapchain()->idBuffer().image;
|
||||
d.imageView = _context->getSwapchain()->idBuffer().imageView;
|
||||
d.format = _context->getSwapchain()->idBuffer().imageFormat;
|
||||
d.extent = _context->getDrawExtent();
|
||||
d.currentLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
return import_image(d);
|
||||
}
|
||||
|
||||
RGImageHandle RenderGraph::import_swapchain_image(uint32_t index)
|
||||
{
|
||||
RGImportedImageDesc d{};
|
||||
|
||||
@@ -56,6 +56,7 @@ struct Pass; // fwd
|
||||
RGImageHandle import_gbuffer_position();
|
||||
RGImageHandle import_gbuffer_normal();
|
||||
RGImageHandle import_gbuffer_albedo();
|
||||
RGImageHandle import_id_buffer();
|
||||
RGImageHandle import_swapchain_image(uint32_t index);
|
||||
void add_present_chain(RGImageHandle sourceDraw,
|
||||
RGImageHandle targetSwapchain,
|
||||
|
||||
@@ -13,7 +13,7 @@ void GLTFMetallic_Roughness::build_pipelines(VulkanEngine *engine)
|
||||
VkPushConstantRange matrixRange{};
|
||||
matrixRange.offset = 0;
|
||||
matrixRange.size = sizeof(GPUDrawPushConstants);
|
||||
matrixRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
||||
matrixRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
|
||||
DescriptorLayoutBuilder layoutBuilder;
|
||||
layoutBuilder.add_binding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
|
||||
@@ -92,9 +92,10 @@ void GLTFMetallic_Roughness::build_pipelines(VulkanEngine *engine)
|
||||
VkFormat gFormats[] = {
|
||||
engine->_swapchainManager->gBufferPosition().imageFormat,
|
||||
engine->_swapchainManager->gBufferNormal().imageFormat,
|
||||
engine->_swapchainManager->gBufferAlbedo().imageFormat
|
||||
engine->_swapchainManager->gBufferAlbedo().imageFormat,
|
||||
engine->_swapchainManager->idBuffer().imageFormat
|
||||
};
|
||||
b.set_color_attachment_formats(std::span<VkFormat>(gFormats, 3));
|
||||
b.set_color_attachment_formats(std::span<VkFormat>(gFormats, 4));
|
||||
b.set_depth_format(engine->_swapchainManager->depthImage().imageFormat);
|
||||
};
|
||||
engine->_pipelineManager->registerGraphics("mesh.gbuffer", gbufferInfo);
|
||||
|
||||
@@ -69,9 +69,11 @@ void GeometryPass::register_graph(RenderGraph *graph,
|
||||
RGImageHandle gbufferPosition,
|
||||
RGImageHandle gbufferNormal,
|
||||
RGImageHandle gbufferAlbedo,
|
||||
RGImageHandle idHandle,
|
||||
RGImageHandle depthHandle)
|
||||
{
|
||||
if (!graph || !gbufferPosition.valid() || !gbufferNormal.valid() || !gbufferAlbedo.valid() || !depthHandle.valid())
|
||||
if (!graph || !gbufferPosition.valid() || !gbufferNormal.valid() || !gbufferAlbedo.valid() ||
|
||||
!idHandle.valid() || !depthHandle.valid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -79,7 +81,7 @@ void GeometryPass::register_graph(RenderGraph *graph,
|
||||
graph->add_pass(
|
||||
"Geometry",
|
||||
RGPassType::Graphics,
|
||||
[gbufferPosition, gbufferNormal, gbufferAlbedo, depthHandle](RGPassBuilder &builder, EngineContext *ctx)
|
||||
[gbufferPosition, gbufferNormal, gbufferAlbedo, idHandle, depthHandle](RGPassBuilder &builder, EngineContext *ctx)
|
||||
{
|
||||
VkClearValue clear{};
|
||||
clear.color = {{0.f, 0.f, 0.f, 0.f}};
|
||||
@@ -87,6 +89,9 @@ void GeometryPass::register_graph(RenderGraph *graph,
|
||||
builder.write_color(gbufferPosition, true, clear);
|
||||
builder.write_color(gbufferNormal, true, clear);
|
||||
builder.write_color(gbufferAlbedo, true, clear);
|
||||
VkClearValue clearID{};
|
||||
clearID.color.uint32[0] = 0u;
|
||||
builder.write_color(idHandle, true, clearID);
|
||||
|
||||
// Reverse-Z: clear depth to 0.0
|
||||
VkClearValue depthClear{};
|
||||
@@ -118,11 +123,11 @@ void GeometryPass::register_graph(RenderGraph *graph,
|
||||
builder.read_buffer(b, RGBufferUsage::StorageRead, 0, "geom.vertex");
|
||||
}
|
||||
},
|
||||
[this, gbufferPosition, gbufferNormal, gbufferAlbedo, depthHandle](VkCommandBuffer cmd,
|
||||
const RGPassResources &res,
|
||||
EngineContext *ctx)
|
||||
[this, gbufferPosition, gbufferNormal, gbufferAlbedo, idHandle, depthHandle](VkCommandBuffer cmd,
|
||||
const RGPassResources &res,
|
||||
EngineContext *ctx)
|
||||
{
|
||||
draw_geometry(cmd, ctx, res, gbufferPosition, gbufferNormal, gbufferAlbedo, depthHandle);
|
||||
draw_geometry(cmd, ctx, res, gbufferPosition, gbufferNormal, gbufferAlbedo, idHandle, depthHandle);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -132,6 +137,7 @@ void GeometryPass::draw_geometry(VkCommandBuffer cmd,
|
||||
RGImageHandle gbufferPosition,
|
||||
RGImageHandle gbufferNormal,
|
||||
RGImageHandle gbufferAlbedo,
|
||||
RGImageHandle /*idHandle*/,
|
||||
RGImageHandle depthHandle) const
|
||||
{
|
||||
EngineContext *ctxLocal = context ? context : _context;
|
||||
@@ -270,6 +276,7 @@ void GeometryPass::draw_geometry(VkCommandBuffer cmd,
|
||||
GPUDrawPushConstants push_constants{};
|
||||
push_constants.worldMatrix = r.transform;
|
||||
push_constants.vertexBuffer = r.vertexBufferAddress;
|
||||
push_constants.objectID = r.objectID;
|
||||
|
||||
vkCmdPushConstants(cmd, r.material->pipeline->layout, VK_SHADER_STAGE_VERTEX_BIT, 0,
|
||||
sizeof(GPUDrawPushConstants), &push_constants);
|
||||
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
RGImageHandle gbufferPosition,
|
||||
RGImageHandle gbufferNormal,
|
||||
RGImageHandle gbufferAlbedo,
|
||||
RGImageHandle idHandle,
|
||||
RGImageHandle depthHandle);
|
||||
|
||||
private:
|
||||
@@ -29,5 +30,6 @@ private:
|
||||
RGImageHandle gbufferPosition,
|
||||
RGImageHandle gbufferNormal,
|
||||
RGImageHandle gbufferAlbedo,
|
||||
RGImageHandle idHandle,
|
||||
RGImageHandle depthHandle) const;
|
||||
};
|
||||
|
||||
@@ -29,7 +29,7 @@ void ShadowPass::init(EngineContext *context)
|
||||
// Keep push constants matching current shader layout for now
|
||||
VkPushConstantRange pc{};
|
||||
pc.offset = 0;
|
||||
// Push constants layout in shadow.vert is mat4 + device address + uint, rounded to 16 bytes
|
||||
// Push constants layout in shadow.vert is GPUDrawPushConstants + cascade index, rounded to 16 bytes
|
||||
const uint32_t pcRaw = static_cast<uint32_t>(sizeof(GPUDrawPushConstants) + sizeof(uint32_t));
|
||||
const uint32_t pcAligned = (pcRaw + 15u) & ~15u; // 16-byte alignment to match std430 expectations
|
||||
pc.size = pcAligned;
|
||||
@@ -197,6 +197,7 @@ void ShadowPass::draw_shadow(VkCommandBuffer cmd,
|
||||
ShadowPC spc{};
|
||||
spc.draw.worldMatrix = r.transform;
|
||||
spc.draw.vertexBuffer = r.vertexBufferAddress;
|
||||
spc.draw.objectID = r.objectID;
|
||||
spc.cascadeIndex = cascadeIndex;
|
||||
vkCmdPushConstants(cmd, layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(ShadowPC), &spc);
|
||||
vkCmdDrawIndexed(cmd, r.indexCount, 1, r.firstIndex, 0, 0);
|
||||
|
||||
@@ -196,6 +196,7 @@ void TransparentPass::draw_transparent(VkCommandBuffer cmd,
|
||||
GPUDrawPushConstants push{};
|
||||
push.worldMatrix = r.transform;
|
||||
push.vertexBuffer = r.vertexBufferAddress;
|
||||
push.objectID = r.objectID;
|
||||
vkCmdPushConstants(cmd, r.material->pipeline->layout, VK_SHADER_STAGE_VERTEX_BIT, 0,
|
||||
sizeof(GPUDrawPushConstants), &push);
|
||||
vkCmdDrawIndexed(cmd, r.indexCount, 1, r.firstIndex, 0, 0);
|
||||
|
||||
Reference in New Issue
Block a user