Create shadow render pass
This commit is contained in:
1 parent
aa2fc4a41a
commit
cffe42e72b
2 files changed
+50
-17
No files matched your search
@@ -393,9 +393,8 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
||||
}
|
||||
|
||||
// Set up depth image
|
||||
const VkFormat depth_img_fmt = VK_FORMAT_D32_SFLOAT;
|
||||
create_img(
|
||||
ctx, depth_img_fmt, ctx->swapchain_extent.width,
|
||||
ctx, VK_FORMAT_D32_SFLOAT, ctx->swapchain_extent.width,
|
||||
ctx->swapchain_extent.height,
|
||||
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
|
||||
VK_IMAGE_ASPECT_DEPTH_BIT, &ctx->depth_img, &ctx->depth_mem,
|
||||
@@ -417,7 +416,7 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
||||
.pScissors = &scissor,
|
||||
};
|
||||
|
||||
// Set up colour attachment
|
||||
// Attachment configs
|
||||
const VkAttachmentDescription colour_attachment = {
|
||||
.format = surface_fmt.format,
|
||||
.samples = VK_SAMPLE_COUNT_1_BIT,
|
||||
@@ -428,14 +427,18 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
||||
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
};
|
||||
const VkAttachmentReference colour_attachment_ref = {
|
||||
.attachment = 0,
|
||||
.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
const VkAttachmentDescription shadow_depth_attachment = {
|
||||
.format = VK_FORMAT_D32_SFLOAT,
|
||||
.samples = VK_SAMPLE_COUNT_1_BIT,
|
||||
.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
|
||||
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
|
||||
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
|
||||
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
|
||||
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
};
|
||||
|
||||
// Set up depth attatchment
|
||||
const VkAttachmentDescription depth_attatchment = {
|
||||
.format = depth_img_fmt,
|
||||
const VkAttachmentDescription render_depth_attachment = {
|
||||
.format = VK_FORMAT_D32_SFLOAT,
|
||||
.samples = VK_SAMPLE_COUNT_1_BIT,
|
||||
.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
|
||||
.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
|
||||
@@ -444,15 +447,37 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
||||
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
};
|
||||
VkAttachmentReference depth_attachment_ref = {
|
||||
.attachment = 1,
|
||||
.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
|
||||
// Create shadow pass
|
||||
const VkRenderPassCreateInfo shadow_pass_config = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
|
||||
.attachmentCount = 1,
|
||||
.pAttachments = &shadow_depth_attachment,
|
||||
.subpassCount = 1,
|
||||
.pSubpasses = &(VkSubpassDescription){
|
||||
.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
.pDepthStencilAttachment = &(VkAttachmentReference) {
|
||||
.attachment = 0,
|
||||
.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
},
|
||||
},
|
||||
.dependencyCount = 1,
|
||||
.pDependencies = &(VkSubpassDependency) {
|
||||
.srcSubpass = VK_SUBPASS_EXTERNAL,
|
||||
.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
.srcAccessMask = VK_ACCESS_SHADER_READ_BIT,
|
||||
.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
|
||||
.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
},
|
||||
};
|
||||
result = vkCreateRenderPass(
|
||||
ctx->dev, &shadow_pass_config, nullptr, &ctx->shadow_pass);
|
||||
assert(result == VK_SUCCESS);
|
||||
|
||||
// Create render pass
|
||||
const VkAttachmentDescription attachment_descs[] = {
|
||||
colour_attachment,
|
||||
depth_attatchment,
|
||||
render_depth_attachment,
|
||||
};
|
||||
const VkSubpassDependency dependency = {
|
||||
.srcSubpass = VK_SUBPASS_EXTERNAL,
|
||||
@@ -466,14 +491,20 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
||||
};
|
||||
const VkRenderPassCreateInfo render_pass_config = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
|
||||
.attachmentCount = 2,
|
||||
.attachmentCount = NELEMS(attachment_descs),
|
||||
.pAttachments = attachment_descs,
|
||||
.subpassCount = 1,
|
||||
.pSubpasses = &(VkSubpassDescription){
|
||||
.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
.colorAttachmentCount = 1,
|
||||
.pColorAttachments = &colour_attachment_ref,
|
||||
.pDepthStencilAttachment = &depth_attachment_ref,
|
||||
.pColorAttachments = &(VkAttachmentReference) {
|
||||
.attachment = 0,
|
||||
.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
},
|
||||
.pDepthStencilAttachment = &(VkAttachmentReference) {
|
||||
.attachment = 1,
|
||||
.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
},
|
||||
},
|
||||
.dependencyCount = 1,
|
||||
.pDependencies = &dependency,
|
||||
@@ -833,6 +864,7 @@ void gpu_cleanup(const gpu_ctx_t *ctx)
|
||||
vkDestroyShaderModule(ctx->dev, ctx->model_vert_shader, nullptr);
|
||||
vkDestroyShaderModule(ctx->dev, ctx->frag_shader, nullptr);
|
||||
|
||||
vkDestroyRenderPass(ctx->dev, ctx->shadow_pass, nullptr);
|
||||
vkDestroyRenderPass(ctx->dev, ctx->render_pass, nullptr);
|
||||
|
||||
vkDestroyImageView(ctx->dev, ctx->depth_view, nullptr);
|
||||
|
||||
Reference in new issue
Block a user