添加创建帧缓存区的colorAttachment
parent
9858f7fa56
commit
e9ed42bfeb
|
@ -1821,28 +1821,117 @@ void VulkanExampleBase::setupFrameBuffer()
|
||||||
/*
|
/*
|
||||||
MSAA
|
MSAA
|
||||||
*/
|
*/
|
||||||
if (settings.multiSampling) {
|
VkFormat colorAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
|
||||||
// Check if device supports requested sample count for color and depth frame buffer
|
VkFormat depthFormat = findDepthFormat();
|
||||||
//assert((deviceProperties.limits.framebufferColorSampleCounts >= sampleCount) && (deviceProperties.limits.framebufferDepthSampleCounts >= sampleCount));
|
if (settings.headless)
|
||||||
|
{
|
||||||
|
if (settings.multiSampling)
|
||||||
|
{
|
||||||
|
|
||||||
|
VkImageCreateInfo imageCI{};
|
||||||
|
imageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
||||||
|
imageCI.imageType = VK_IMAGE_TYPE_2D;
|
||||||
|
imageCI.format = colorAttachmentFormat;
|
||||||
|
imageCI.extent.width = settings.width;
|
||||||
|
imageCI.extent.height = settings.height;
|
||||||
|
imageCI.extent.depth = 1;
|
||||||
|
imageCI.mipLevels = 1;
|
||||||
|
imageCI.arrayLayers = 1;
|
||||||
|
imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
|
imageCI.samples = settings.sampleCount;
|
||||||
|
imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||||
|
imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
|
||||||
|
VK_CHECK_RESULT(vkCreateImage(device, &imageCI, nullptr, &multisampleTarget.color.image));
|
||||||
|
|
||||||
|
VkMemoryRequirements memReqs;
|
||||||
|
vkGetImageMemoryRequirements(device, multisampleTarget.color.image, &memReqs);
|
||||||
|
VkMemoryAllocateInfo memAllocInfo{};
|
||||||
|
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
memAllocInfo.allocationSize = memReqs.size;
|
||||||
|
VkBool32 lazyMemTypePresent;
|
||||||
|
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, &lazyMemTypePresent);
|
||||||
|
if (!lazyMemTypePresent) {
|
||||||
|
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
|
}
|
||||||
|
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &multisampleTarget.color.memory));
|
||||||
|
vkBindImageMemory(device, multisampleTarget.color.image, multisampleTarget.color.memory, 0);
|
||||||
|
|
||||||
|
// Create image view for the MSAA color image target
|
||||||
|
VkImageViewCreateInfo imageViewCI{};
|
||||||
|
imageViewCI.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
|
imageViewCI.image = multisampleTarget.color.image;
|
||||||
|
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
imageViewCI.format = colorAttachmentFormat;
|
||||||
|
imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
|
||||||
|
imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
|
||||||
|
imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
|
||||||
|
imageViewCI.components.a = VK_COMPONENT_SWIZZLE_A;
|
||||||
|
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
imageViewCI.subresourceRange.levelCount = 1;
|
||||||
|
imageViewCI.subresourceRange.layerCount = 1;
|
||||||
|
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &multisampleTarget.color.view));
|
||||||
|
|
||||||
|
// Depth target
|
||||||
|
imageCI.imageType = VK_IMAGE_TYPE_2D;
|
||||||
|
imageCI.format = depthFormat;
|
||||||
|
imageCI.extent.width = settings.width;
|
||||||
|
imageCI.extent.height = settings.height;
|
||||||
|
imageCI.extent.depth = 1;
|
||||||
|
imageCI.mipLevels = 1;
|
||||||
|
imageCI.arrayLayers = 1;
|
||||||
|
imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
|
imageCI.samples = settings.sampleCount;
|
||||||
|
imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||||
|
imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
VK_CHECK_RESULT(vkCreateImage(device, &imageCI, nullptr, &multisampleTarget.depth.image));
|
||||||
|
|
||||||
|
vkGetImageMemoryRequirements(device, multisampleTarget.depth.image, &memReqs);
|
||||||
|
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
memAllocInfo.allocationSize = memReqs.size;
|
||||||
|
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, &lazyMemTypePresent);
|
||||||
|
if (!lazyMemTypePresent) {
|
||||||
|
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
|
}
|
||||||
|
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &multisampleTarget.depth.memory));
|
||||||
|
vkBindImageMemory(device, multisampleTarget.depth.image, multisampleTarget.depth.memory, 0);
|
||||||
|
|
||||||
|
// Create image view for the MSAA target
|
||||||
|
imageViewCI.image = multisampleTarget.depth.image;
|
||||||
|
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
imageViewCI.format = depthFormat;
|
||||||
|
imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
|
||||||
|
imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
|
||||||
|
imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
|
||||||
|
imageViewCI.components.a = VK_COMPONENT_SWIZZLE_A;
|
||||||
|
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
|
imageViewCI.subresourceRange.levelCount = 1;
|
||||||
|
imageViewCI.subresourceRange.layerCount = 1;
|
||||||
|
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &multisampleTarget.depth.view));
|
||||||
|
}
|
||||||
|
// creat color image
|
||||||
VkImageCreateInfo imageCI{};
|
VkImageCreateInfo imageCI{};
|
||||||
imageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
imageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
||||||
imageCI.imageType = VK_IMAGE_TYPE_2D;
|
imageCI.imageType = VK_IMAGE_TYPE_2D;
|
||||||
imageCI.format = swapChain.colorFormat;
|
imageCI.format = colorAttachmentFormat;
|
||||||
imageCI.extent.width = width;
|
imageCI.extent.width = settings.width;
|
||||||
imageCI.extent.height = height;
|
imageCI.extent.height = settings.height;
|
||||||
imageCI.extent.depth = 1;
|
imageCI.extent.depth = 1;
|
||||||
imageCI.mipLevels = 1;
|
imageCI.mipLevels = 1;
|
||||||
imageCI.arrayLayers = 1;
|
imageCI.arrayLayers = 1;
|
||||||
imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
|
imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
imageCI.samples = settings.sampleCount;
|
imageCI.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||||
imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
VK_CHECK_RESULT(vkCreateImage(device, &imageCI, nullptr, &multisampleTarget.color.image));
|
|
||||||
|
VK_CHECK_RESULT(vkCreateImage(device, &imageCI, nullptr, &colorAttachment.image));
|
||||||
|
|
||||||
VkMemoryRequirements memReqs;
|
VkMemoryRequirements memReqs;
|
||||||
vkGetImageMemoryRequirements(device, multisampleTarget.color.image, &memReqs);
|
vkGetImageMemoryRequirements(device, colorAttachment.image, &memReqs);
|
||||||
|
|
||||||
VkMemoryAllocateInfo memAllocInfo{};
|
VkMemoryAllocateInfo memAllocInfo{};
|
||||||
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
memAllocInfo.allocationSize = memReqs.size;
|
memAllocInfo.allocationSize = memReqs.size;
|
||||||
|
@ -1851,15 +1940,16 @@ void VulkanExampleBase::setupFrameBuffer()
|
||||||
if (!lazyMemTypePresent) {
|
if (!lazyMemTypePresent) {
|
||||||
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
}
|
}
|
||||||
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &multisampleTarget.color.memory));
|
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &colorAttachment.memory));
|
||||||
vkBindImageMemory(device, multisampleTarget.color.image, multisampleTarget.color.memory, 0);
|
|
||||||
|
|
||||||
// Create image view for the MSAA target
|
vkBindImageMemory(device, colorAttachment.image, colorAttachment.memory, 0);
|
||||||
|
|
||||||
|
// Create image view for the color image
|
||||||
VkImageViewCreateInfo imageViewCI{};
|
VkImageViewCreateInfo imageViewCI{};
|
||||||
imageViewCI.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
imageViewCI.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
imageViewCI.image = multisampleTarget.color.image;
|
imageViewCI.image = colorAttachment.image;
|
||||||
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
imageViewCI.format = swapChain.colorFormat;
|
imageViewCI.format = colorAttachmentFormat;
|
||||||
imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
|
imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
|
||||||
imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
|
imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
|
||||||
imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
|
imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
|
||||||
|
@ -1867,103 +1957,158 @@ void VulkanExampleBase::setupFrameBuffer()
|
||||||
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
imageViewCI.subresourceRange.levelCount = 1;
|
imageViewCI.subresourceRange.levelCount = 1;
|
||||||
imageViewCI.subresourceRange.layerCount = 1;
|
imageViewCI.subresourceRange.layerCount = 1;
|
||||||
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &multisampleTarget.color.view));
|
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &colorAttachment.view));
|
||||||
|
|
||||||
// Depth target
|
// create image for the depth image
|
||||||
imageCI.imageType = VK_IMAGE_TYPE_2D;
|
VkImageCreateInfo image = {};
|
||||||
imageCI.format = depthFormat;
|
image.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
||||||
imageCI.extent.width = width;
|
image.pNext = NULL;
|
||||||
imageCI.extent.height = height;
|
image.imageType = VK_IMAGE_TYPE_2D;
|
||||||
imageCI.extent.depth = 1;
|
image.format = depthFormat;
|
||||||
imageCI.mipLevels = 1;
|
image.extent.width = settings.width;
|
||||||
imageCI.arrayLayers = 1;
|
image.extent.height = settings.height;
|
||||||
imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
image.extent.depth = 1;
|
||||||
imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
|
image.mipLevels = 1;
|
||||||
imageCI.samples = settings.sampleCount;
|
image.arrayLayers = 1;
|
||||||
imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
image.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
image.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
VK_CHECK_RESULT(vkCreateImage(device, &imageCI, nullptr, &multisampleTarget.depth.image));
|
image.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
|
image.flags = 0;
|
||||||
|
|
||||||
vkGetImageMemoryRequirements(device, multisampleTarget.depth.image, &memReqs);
|
VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &depthStencil.image));
|
||||||
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
|
||||||
memAllocInfo.allocationSize = memReqs.size;
|
VkMemoryAllocateInfo memAlloc = {};
|
||||||
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, &lazyMemTypePresent);
|
memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
if (!lazyMemTypePresent) {
|
memAlloc.pNext = NULL;
|
||||||
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
memAlloc.allocationSize = 0;
|
||||||
|
memAlloc.memoryTypeIndex = 0;
|
||||||
|
VkMemoryRequirements depthAttachmentMemReqs;
|
||||||
|
vkGetImageMemoryRequirements(device, depthStencil.image, &memReqs);
|
||||||
|
memAlloc.allocationSize = depthAttachmentMemReqs.size;
|
||||||
|
memAlloc.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
|
VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &depthStencil.mem));
|
||||||
|
VK_CHECK_RESULT(vkBindImageMemory(device, depthStencil.image, depthStencil.mem, 0));
|
||||||
|
|
||||||
|
|
||||||
|
// create image view for depth image
|
||||||
|
VkImageViewCreateInfo depthStencilView = {};
|
||||||
|
depthStencilView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
|
depthStencilView.pNext = NULL;
|
||||||
|
depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
depthStencilView.format = depthFormat;
|
||||||
|
depthStencilView.image = depthStencil.image;
|
||||||
|
depthStencilView.flags = 0;
|
||||||
|
depthStencilView.subresourceRange = {};
|
||||||
|
depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
|
if (depthFormat >= VK_FORMAT_D16_UNORM_S8_UINT)
|
||||||
|
{
|
||||||
|
depthStencilView.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
}
|
}
|
||||||
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &multisampleTarget.depth.memory));
|
depthStencilView.subresourceRange.baseMipLevel = 0;
|
||||||
vkBindImageMemory(device, multisampleTarget.depth.image, multisampleTarget.depth.memory, 0);
|
depthStencilView.subresourceRange.levelCount = 1;
|
||||||
|
depthStencilView.subresourceRange.baseArrayLayer = 0;
|
||||||
|
depthStencilView.subresourceRange.layerCount = 1;
|
||||||
|
VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view));
|
||||||
|
|
||||||
// Create image view for the MSAA target
|
}
|
||||||
imageViewCI.image = multisampleTarget.depth.image;
|
else
|
||||||
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
{
|
||||||
imageViewCI.format = depthFormat;
|
|
||||||
imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
|
swapChainImageViews.resize(swapChain.imageCount);
|
||||||
imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
|
for (size_t i = 0; i < swapChain.imageCount; i++)
|
||||||
imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
|
{
|
||||||
imageViewCI.components.a = VK_COMPONENT_SWIZZLE_A;
|
VkImageViewCreateInfo creatInfo{};
|
||||||
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
|
creatInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
imageViewCI.subresourceRange.levelCount = 1;
|
creatInfo.image = swapChain.images[i];
|
||||||
imageViewCI.subresourceRange.layerCount = 1;
|
creatInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &multisampleTarget.depth.view));
|
creatInfo.format = swapChain.colorFormat;
|
||||||
|
|
||||||
|
creatInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||||
|
creatInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||||
|
creatInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||||
|
creatInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
|
||||||
|
|
||||||
|
creatInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
creatInfo.subresourceRange.baseMipLevel = 0;
|
||||||
|
creatInfo.subresourceRange.levelCount = 1;
|
||||||
|
creatInfo.subresourceRange.baseArrayLayer = 0;
|
||||||
|
creatInfo.subresourceRange.layerCount = 1;
|
||||||
|
|
||||||
|
if (vkCreateImageView(device, &creatInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS)
|
||||||
|
{
|
||||||
|
throw std::runtime_error("failed to creat image view");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.headless)
|
||||||
|
{
|
||||||
|
auto frameRange = settings.endFrameIndex - settings.startFrameCount;
|
||||||
|
if (settings.multiSampling)
|
||||||
|
{
|
||||||
|
|
||||||
// Depth/Stencil attachment is the same for all frame buffers
|
for (int i = 0; i < frameRange; i++)
|
||||||
|
{
|
||||||
|
VkImageView attachments[4];
|
||||||
|
attachments[0] = multisampleTarget.color.view;
|
||||||
|
attachments[1] = multisampleTarget.depth.view;
|
||||||
|
attachments[2] = depthStencil.view;
|
||||||
|
attachments[3] = colorAttachment.view;
|
||||||
|
|
||||||
VkImageCreateInfo image = {};
|
VkFramebufferCreateInfo framebufferCreateInfo = vks::initializers::framebufferCreateInfo();
|
||||||
image.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
framebufferCreateInfo.renderPass = renderPass;
|
||||||
image.pNext = NULL;
|
framebufferCreateInfo.attachmentCount = 4;
|
||||||
image.imageType = VK_IMAGE_TYPE_2D;
|
framebufferCreateInfo.pAttachments = attachments;
|
||||||
image.format = depthFormat;
|
framebufferCreateInfo.width = settings.width;
|
||||||
image.extent = { width, height, 1 };
|
framebufferCreateInfo.height = settings.height;
|
||||||
image.mipLevels = 1;
|
framebufferCreateInfo.layers = 1;
|
||||||
image.arrayLayers = 1;
|
|
||||||
image.samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
image.tiling = VK_IMAGE_TILING_OPTIMAL;
|
|
||||||
image.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
|
||||||
image.flags = 0;
|
|
||||||
|
|
||||||
VkMemoryAllocateInfo mem_alloc = {};
|
VK_CHECK_RESULT(vkCreateFramebuffer(device, &framebufferCreateInfo, nullptr, &frameBuffers[i]));
|
||||||
mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
}
|
||||||
mem_alloc.pNext = NULL;
|
|
||||||
mem_alloc.allocationSize = 0;
|
|
||||||
mem_alloc.memoryTypeIndex = 0;
|
|
||||||
|
|
||||||
VkImageViewCreateInfo depthStencilView = {};
|
}
|
||||||
depthStencilView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
else
|
||||||
depthStencilView.pNext = NULL;
|
{
|
||||||
depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
for (int i = 0; i < frameRange; i++)
|
||||||
depthStencilView.format = depthFormat;
|
{
|
||||||
depthStencilView.flags = 0;
|
VkImageView attachments[2];
|
||||||
depthStencilView.subresourceRange = {};
|
attachments[0] = colorAttachment.view;
|
||||||
depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
|
attachments[1] = depthStencil.view;
|
||||||
depthStencilView.subresourceRange.baseMipLevel = 0;
|
|
||||||
depthStencilView.subresourceRange.levelCount = 1;
|
|
||||||
depthStencilView.subresourceRange.baseArrayLayer = 0;
|
|
||||||
depthStencilView.subresourceRange.layerCount = 1;
|
|
||||||
|
|
||||||
VkMemoryRequirements memReqs;
|
VkFramebufferCreateInfo framebufferCreateInfo = vks::initializers::framebufferCreateInfo();
|
||||||
VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &depthStencil.image));
|
framebufferCreateInfo.renderPass = renderPass;
|
||||||
vkGetImageMemoryRequirements(device, depthStencil.image, &memReqs);
|
framebufferCreateInfo.attachmentCount = 2;
|
||||||
mem_alloc.allocationSize = memReqs.size;
|
framebufferCreateInfo.pAttachments = attachments;
|
||||||
mem_alloc.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
framebufferCreateInfo.width = settings.width;
|
||||||
VK_CHECK_RESULT(vkAllocateMemory(device, &mem_alloc, nullptr, &depthStencil.mem));
|
framebufferCreateInfo.height = settings.height;
|
||||||
VK_CHECK_RESULT(vkBindImageMemory(device, depthStencil.image, depthStencil.mem, 0));
|
framebufferCreateInfo.layers = 1;
|
||||||
|
VK_CHECK_RESULT(vkCreateFramebuffer(device, &framebufferCreateInfo, nullptr, &frameBuffers[i]));
|
||||||
|
|
||||||
depthStencilView.image = depthStencil.image;
|
}
|
||||||
VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view));
|
}
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
VkImageView attachments[4];
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
createSwapChainFramebuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanExampleBase::createSwapChainFramebuffer()
|
||||||
|
{
|
||||||
|
uint32_t attachmentCount;
|
||||||
|
VkImageView attachments[attachmentCount];
|
||||||
|
|
||||||
if (settings.multiSampling) {
|
if (settings.multiSampling) {
|
||||||
|
attachmentCount = 4;
|
||||||
attachments[0] = multisampleTarget.color.view;
|
attachments[0] = multisampleTarget.color.view;
|
||||||
attachments[2] = multisampleTarget.depth.view;
|
attachments[1] = multisampleTarget.depth.view;
|
||||||
attachments[3] = depthStencil.view;
|
attachments[2] = depthStencil.view;
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
attachmentCount = 2;
|
||||||
attachments[1] = depthStencil.view;
|
attachments[1] = depthStencil.view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1971,20 +2116,22 @@ void VulkanExampleBase::setupFrameBuffer()
|
||||||
frameBufferCI.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
frameBufferCI.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||||
frameBufferCI.pNext = NULL;
|
frameBufferCI.pNext = NULL;
|
||||||
frameBufferCI.renderPass = renderPass;
|
frameBufferCI.renderPass = renderPass;
|
||||||
frameBufferCI.attachmentCount = settings.multiSampling ? 4 :2;
|
frameBufferCI.attachmentCount = attachmentCount;
|
||||||
frameBufferCI.pAttachments = attachments;
|
frameBufferCI.pAttachments = attachments;
|
||||||
frameBufferCI.width = width;
|
frameBufferCI.width = settings.width;
|
||||||
frameBufferCI.height = height;
|
frameBufferCI.height = settings.height;
|
||||||
frameBufferCI.layers = 1;
|
frameBufferCI.layers = 1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Create frame buffers for every swap chain image
|
// Create frame buffers for every swap chain image
|
||||||
frameBuffers.resize(swapChain.imageCount);
|
frameBuffers.resize(swapChainImageViews.size());
|
||||||
for (uint32_t i = 0; i < frameBuffers.size(); i++) {
|
for (uint32_t i = 0; i < swapChainImageViews.size(); i++) {
|
||||||
if (settings.multiSampling) {
|
if (settings.multiSampling) {
|
||||||
attachments[1] = swapChain.buffers[i].view;
|
attachments[3] = swapChainImageViews[i];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
attachments[0] = swapChain.buffers[i].view;
|
attachments[0] = swapChainImageViews[i];
|
||||||
}
|
}
|
||||||
VK_CHECK_RESULT(vkCreateFramebuffer(device, &frameBufferCI, nullptr, &frameBuffers[i]));
|
VK_CHECK_RESULT(vkCreateFramebuffer(device, &frameBufferCI, nullptr, &frameBuffers[i]));
|
||||||
}
|
}
|
||||||
|
@ -2075,3 +2222,31 @@ void VulkanExampleBase::setupSwapChain()
|
||||||
{
|
{
|
||||||
swapChain.create(&width, &height, settings.vsync);
|
swapChain.create(&width, &height, settings.vsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkFormat VulkanExampleBase::findDepthFormat()
|
||||||
|
{
|
||||||
|
return findSupportedFormat(
|
||||||
|
{ VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT },
|
||||||
|
VK_IMAGE_TILING_OPTIMAL,
|
||||||
|
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
VkFormat VulkanExampleBase::findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features)
|
||||||
|
{
|
||||||
|
for (VkFormat format : candidates)
|
||||||
|
{
|
||||||
|
VkFormatProperties props;
|
||||||
|
vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props);
|
||||||
|
|
||||||
|
if (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features)
|
||||||
|
{
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
else if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features)
|
||||||
|
{
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw std::runtime_error("failed to find supported format");
|
||||||
|
}
|
||||||
|
|
|
@ -113,13 +113,16 @@ public:
|
||||||
uint32_t lastFPS = 0;
|
uint32_t lastFPS = 0;
|
||||||
|
|
||||||
struct Settings {
|
struct Settings {
|
||||||
bool validation = false; // 校验层开关
|
uint32_t width = 1280;
|
||||||
|
uint32_t height = 720;
|
||||||
|
bool validation = true; // 校验层开关
|
||||||
bool fullscreen = false; // 全屏开关
|
bool fullscreen = false; // 全屏开关
|
||||||
bool vsync = false; // 垂直同步开关
|
bool vsync = false; // 垂直同步开关
|
||||||
bool multiSampling = true; // 多重采样
|
bool multiSampling = true; // 多重采样
|
||||||
bool rotateModel = true; // 模型自旋转(暂时失效)
|
bool rotateModel = true; // 模型自旋转(暂时失效)
|
||||||
bool headless = false; // 无头开关
|
bool headless = false; // 无头开关
|
||||||
bool outputPNGimage = false;
|
bool outputPNGimage = false;
|
||||||
|
uint32_t endFrameIndex = 75;
|
||||||
bool enableSaveToImageSequeue = true; // 图片序列开关(暂时弃用)
|
bool enableSaveToImageSequeue = true; // 图片序列开关(暂时弃用)
|
||||||
uint32_t outputFrameCount = 75; // 图片序列结束帧
|
uint32_t outputFrameCount = 75; // 图片序列结束帧
|
||||||
bool takeScreenShot = false; // 截屏(暂时弃用)
|
bool takeScreenShot = false; // 截屏(暂时弃用)
|
||||||
|
@ -136,6 +139,14 @@ public:
|
||||||
VkImageView view;
|
VkImageView view;
|
||||||
} depthStencil;
|
} depthStencil;
|
||||||
|
|
||||||
|
struct ColorAttachment {
|
||||||
|
VkImage image;
|
||||||
|
VkDeviceMemory memory;
|
||||||
|
VkImageView view;
|
||||||
|
} colorAttachment;
|
||||||
|
|
||||||
|
std::vector<VkImageView> swapChainImageViews;
|
||||||
|
|
||||||
struct GamePadState {
|
struct GamePadState {
|
||||||
glm::vec2 axisLeft = glm::vec2(0.0f);
|
glm::vec2 axisLeft = glm::vec2(0.0f);
|
||||||
glm::vec2 axisRight = glm::vec2(0.0f);
|
glm::vec2 axisRight = glm::vec2(0.0f);
|
||||||
|
@ -257,11 +268,14 @@ public:
|
||||||
virtual void render() = 0;
|
virtual void render() = 0;
|
||||||
virtual void windowResized();
|
virtual void windowResized();
|
||||||
virtual void setupFrameBuffer();
|
virtual void setupFrameBuffer();
|
||||||
|
void createSwapChainFramebuffer();
|
||||||
virtual void prepare();
|
virtual void prepare();
|
||||||
virtual void fileDropped(std::string filename);
|
virtual void fileDropped(std::string filename);
|
||||||
|
|
||||||
void initSwapchain();
|
void initSwapchain();
|
||||||
void setupSwapChain();
|
void setupSwapChain();
|
||||||
|
VkFormat findDepthFormat();
|
||||||
|
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
|
||||||
|
|
||||||
void renderLoop();
|
void renderLoop();
|
||||||
void renderFrame();
|
void renderFrame();
|
||||||
|
|
Loading…
Reference in New Issue