准备纹理图像
现在我们可以回到createTextureImage函数。复制暂存缓冲中的数据到纹理图像,我们需要进行下面两步操作:
-
变换纹理图像到VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-
执行图像数据复制操作
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
copyBufferToImage(stagingBuffer, textureImage, static_cast<uint32_t>(texWidth), static_cast<uint32_t>(texHeight));
这里我们创建的图像对象使用VK_IMAGE_LAYOUT_UNDEFINED布局,所以转换图像布局时应该将VK_IMAGE_LAYOUT_UNDEFINED指定为旧布局。需要注意的是我们之所以这样设置是因为我们不需要读取复制操作之前的图像内容。
为了能够在着色器中采样纹理图像数据,我们还需要进行一次图像布局变换:
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);