vkCmdBlitImage
을 사용하여 밉맵 런타임 (glGenerateMipmap()
기능 구현)을 생성하려고하지만 프로세스를 이해하지 못합니다. 지금까지 내 코드는 다음과 같습니다.Vulkan에서 밉맵 생성
VkImageCreateInfo imageCreateInfo = {};
imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
imageCreateInfo.pNext = nullptr;
imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
imageCreateInfo.format = format;
imageCreateInfo.mipLevels = mipLevels;
imageCreateInfo.arrayLayers = 1;
imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
imageCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
imageCreateInfo.extent = { static_cast<std::uint32_t>(width), static_cast<std::uint32_t>(height), 1 };
imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
err = vkCreateImage(GfxDeviceGlobal::device, &imageCreateInfo, nullptr, &image);
...
for (int i = 1; i < mipLevels; ++i)
{
const std::int32_t mipWidth = width >> i;
const std::int32_t mipHeight = height >> i;
VkImageBlit imageBlit = {};
imageBlit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
imageBlit.srcSubresource.baseArrayLayer = 0;
imageBlit.srcSubresource.layerCount = 1;
imageBlit.srcSubresource.mipLevel = 0;
imageBlit.srcOffsets[ 0 ] = { 0, 0, 0 };
imageBlit.srcOffsets[ 1 ] = { width, height, 1 };
imageBlit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
imageBlit.dstSubresource.baseArrayLayer = 0;
imageBlit.dstSubresource.layerCount = 1;
imageBlit.dstSubresource.mipLevel = i;
imageBlit.dstOffsets[ 0 ] = { 0, 0, 0 };
imageBlit.dstOffsets[ 1 ] = { mipWidth, mipHeight, 1 };
vkCmdBlitImage(texCmdBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, &imageBlit, VK_FILTER_LINEAR);
}
각 밉 레벨에는 고유 한 이미지가 필요합니까? 그것들을 어떻게 초기화해야합니까? 텍스처 데이터에 스테이징 버퍼를 사용할 때 언제 밉맵을 생성해야합니까?
편집 : 제안 된대로 하나의 이미지 만 사용하도록 코드가 수정되었으므로 RenderDoc 텍스처 뷰어에서 올바른 밉 레벨 이미지를 볼 수 있으며 유효성 검사 오류가 발생하지 않습니다.
src와 dst 이미지는 동일 할 수 있습니다. 이 목적을 위해 아마도해야합니다. ; 각 이미지는 최소 1 밉 레벨 ([0]이 기본 "텍스처"임)을가집니다. 'i'는'나는'이상하게 들린다. – krOoze