From 1629bbdcf53adb67df7ed1d9fb96cd7f73a0db38 Mon Sep 17 00:00:00 2001 From: ink-soul Date: Tue, 23 May 2023 11:30:21 +0800 Subject: [PATCH] update framebuffer setup --- homework/homework1/homework1.cpp | 82 ++++++++++++++++++++++++++++++++ homework/homework1/homework1.h | 2 + 2 files changed, 84 insertions(+) diff --git a/homework/homework1/homework1.cpp b/homework/homework1/homework1.cpp index 95b6bd4..eb3f27d 100644 --- a/homework/homework1/homework1.cpp +++ b/homework/homework1/homework1.cpp @@ -660,7 +660,23 @@ VulkanExample::VulkanExample(): camera.setPerspective(60.0f, (float)width / (float)height, 0.1f, 256.0f); } +void VulkanExample::setupFrameBuffer() +{ + if (pbrFrameBuffer.bCreate && (pbrFrameBuffer.fbo.width != width || pbrFrameBuffer.fbo.height != height)) + { + pbrFrameBuffer.color.destroy(device); + pbrFrameBuffer.depth.destroy(device); + pbrFrameBuffer.fbo.destroy(device); + vkDestroySampler(device, colorSampler, nullptr); + } + pbrFrameBuffer.fbo.setSize(width, height); + VkFormat attachDepthFormat; + VkBool32 validDepthFormat = vks::tools::getSupportedDepthFormat(physicalDevice, &attachDepthFormat); + assert(validDepthFormat); + + +} void VulkanExample::getEnabledFeatures() { @@ -994,6 +1010,72 @@ void VulkanExample::getEnabledFeatures() memcpy(shaderData.buffer.mapped, &shaderData.values, sizeof(shaderData.values)); } + //-------------------------- pbr precompute start ---------------------------------- + +#pragma region pbr render pass setting + + void VulkanExample::createAttachment(VkFormat format, VkImageUsageFlagBits usage, VulkanExample::FrameBufferAttachment* attachment, uint32_t width, uint32_t height) + { + VkImageAspectFlags aspectMask = 0; + VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + attachment->format = format; + if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + { + aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + imageUsage |= VK_IMAGE_USAGE_SAMPLED_BIT; + } + if (usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) + { + aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + if (format >= VK_FORMAT_D16_UNORM_S8_UINT) + aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + + assert(aspectMask > 0); + + VkImageCreateInfo image = vks::initializers::imageCreateInfo(); + image.imageType = VK_IMAGE_TYPE_2D; + image.format = format; + image.extent.width = width; + image.extent.height = height; + image.extent.depth = 1; + image.mipLevels = 1; + image.arrayLayers = 1; + image.samples = VK_SAMPLE_COUNT_1_BIT; + image.tiling = VK_IMAGE_TILING_OPTIMAL; + image.usage = imageUsage | usage; + + VkMemoryAllocateInfo memAlloc = vks::initializers::memoryAllocateInfo(); + VkMemoryRequirements memReqs; + + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &attachment->image)); + vkGetImageMemoryRequirements(device, attachment->image, &memReqs); + memAlloc.allocationSize = memReqs.size; + memAlloc.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &attachment->deviceMemory)); + VK_CHECK_RESULT(vkBindImageMemory(device, attachment->image, attachment->deviceMemory, 0)); + + VkImageViewCreateInfo imageView = vks::initializers::imageViewCreateInfo(); + imageView.viewType = VK_IMAGE_VIEW_TYPE_2D; + imageView.format = format; + imageView.subresourceRange = {}; + imageView.subresourceRange.aspectMask = aspectMask; + imageView.subresourceRange.baseMipLevel = 0; + imageView.subresourceRange.levelCount = 1; + imageView.subresourceRange.baseArrayLayer = 0; + imageView.subresourceRange.layerCount = 1; + imageView.image = attachment->image; + VK_CHECK_RESULT(vkCreateImageView(device, &imageView, nullptr, &attachment->imageView)); + } + + +#pragma endregion + + + + + + // ----------------------- pbr precompute end --------------------------------------- void VulkanExample::prepare() { VulkanExampleBase::prepare(); diff --git a/homework/homework1/homework1.h b/homework/homework1/homework1.h index 9c6c08a..1c7d3f3 100644 --- a/homework/homework1/homework1.h +++ b/homework/homework1/homework1.h @@ -357,6 +357,8 @@ public: } void loadglTFFile(std::string filename); virtual void getEnabledFeatures(); + void createAttachment(VkFormat format, VkImageUsageFlagBits usage, FrameBufferAttachment* attachment, uint32_t width, uint32_t height); + virtual void setupFrameBuffer(); void buildCommandBuffers(); void loadAssets(); void setupDescriptors();