화면크기변경 로직 추가
This commit is contained in:
@@ -52,7 +52,7 @@ TextureHandle Graphics::CreateTexture(gsl::czstring path) {
|
||||
stbi_image_free(pixel_data);
|
||||
|
||||
TextureHandle handle =
|
||||
CreateImage(image_extents,
|
||||
CreateImage(image_extents, VK_FORMAT_R8G8B8A8_SRGB,
|
||||
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||
|
||||
@@ -62,7 +62,8 @@ TextureHandle Graphics::CreateTexture(gsl::czstring path) {
|
||||
TransitionImageLayout(handle.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
|
||||
handle.image_view = CreateImageView(handle.image, VK_FORMAT_R8G8B8A8_SRGB);
|
||||
handle.image_view = CreateImageView(handle.image, VK_FORMAT_R8G8B8A8_SRGB,
|
||||
VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
VkDescriptorSetAllocateInfo set_info = {};
|
||||
set_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
@@ -96,14 +97,23 @@ TextureHandle Graphics::CreateTexture(gsl::czstring path) {
|
||||
|
||||
void Graphics::DestroyTexture(TextureHandle handle) {
|
||||
vkDeviceWaitIdle(logical_device_);
|
||||
vkFreeDescriptorSets(logical_device_, texture_pool_, 1, &handle.set);
|
||||
vkDestroyImageView(logical_device_, handle.image_view, nullptr);
|
||||
vkDestroyImage(logical_device_, handle.image, nullptr);
|
||||
vkFreeMemory(logical_device_, handle.memory, nullptr);
|
||||
|
||||
if (handle.set != VK_NULL_HANDLE)
|
||||
vkFreeDescriptorSets(logical_device_, texture_pool_, 1, &handle.set);
|
||||
|
||||
if (handle.image_view != VK_NULL_HANDLE)
|
||||
vkDestroyImageView(logical_device_, handle.image_view, nullptr);
|
||||
|
||||
if (handle.image != VK_NULL_HANDLE)
|
||||
vkDestroyImage(logical_device_, handle.image, nullptr);
|
||||
|
||||
if (handle.memory != VK_NULL_HANDLE)
|
||||
vkFreeMemory(logical_device_, handle.memory, nullptr);
|
||||
}
|
||||
|
||||
void Graphics::SetTexture(TextureHandle handle) {
|
||||
vkCmdBindDescriptorSets(command_buffer_, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
vkCmdBindDescriptorSets(frames_[current_frame_].command_buffer,
|
||||
VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
pipeline_layout_, 1, 1, &handle.set, 0, nullptr);
|
||||
}
|
||||
|
||||
@@ -118,7 +128,6 @@ void Graphics::TransitionImageLayout(VkImage image, VkImageLayout old_layout,
|
||||
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
barrier.image = image;
|
||||
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
barrier.subresourceRange.baseArrayLayer = 0;
|
||||
barrier.subresourceRange.baseMipLevel = 0;
|
||||
barrier.subresourceRange.levelCount = 1;
|
||||
@@ -139,8 +148,20 @@ void Graphics::TransitionImageLayout(VkImage image, VkImageLayout old_layout,
|
||||
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
||||
source_stage = VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||
destination_stage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
|
||||
} else if (old_layout == VK_IMAGE_LAYOUT_UNDEFINED &&
|
||||
new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
|
||||
barrier.srcAccessMask = 0;
|
||||
barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
source_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
||||
destination_stage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
|
||||
}
|
||||
|
||||
if (new_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)
|
||||
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
else
|
||||
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
|
||||
vkCmdPipelineBarrier(local_command_buffer, source_stage, destination_stage, 0,
|
||||
0, nullptr, 0, nullptr, 1, &barrier);
|
||||
|
||||
@@ -169,7 +190,8 @@ void Graphics::CopyBufferToImage(VkBuffer buffer, VkImage image,
|
||||
EndTransientCommandBuffer(local_command_buffer);
|
||||
}
|
||||
|
||||
TextureHandle Graphics::CreateImage(glm::ivec2 size, VkBufferUsageFlags usage,
|
||||
TextureHandle Graphics::CreateImage(glm::ivec2 size, VkFormat image_format,
|
||||
VkBufferUsageFlags usage,
|
||||
VkMemoryPropertyFlags properties) {
|
||||
TextureHandle handle = {};
|
||||
|
||||
@@ -183,7 +205,7 @@ TextureHandle Graphics::CreateImage(glm::ivec2 size, VkBufferUsageFlags usage,
|
||||
image_info.extent.depth = 1;
|
||||
image_info.mipLevels = 1;
|
||||
image_info.arrayLayers = 1;
|
||||
image_info.format = VK_FORMAT_R8G8B8A8_SRGB;
|
||||
image_info.format = image_format;
|
||||
image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||
image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
image_info.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||
@@ -216,4 +238,13 @@ TextureHandle Graphics::CreateImage(glm::ivec2 size, VkBufferUsageFlags usage,
|
||||
return handle;
|
||||
}
|
||||
|
||||
void Graphics::CreateDepthResources() {
|
||||
VkFormat kDepthFormat = VK_FORMAT_D32_SFLOAT;
|
||||
depth_texture_ = CreateImage({extent_.width, extent_.height}, kDepthFormat,
|
||||
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||
depth_texture_.image_view = CreateImageView(
|
||||
depth_texture_.image, kDepthFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
|
||||
}
|
||||
|
||||
} // namespace veng
|
||||
|
||||
Reference in New Issue
Block a user