我使用vkGetPhysicalDeviceSurfaceFormatsKHR
为交换链获取支持的图像格式,并且(在 Linux + Nvidia 上,使用 SDL)我得到VK_FORMAT_B8G8R8A8_UNORM
第一个选项,然后我继续创建具有该格式的交换链:
VkSwapchainCreateInfoKHR swapchain_info = {
...
.imageFormat = format, /* taken from vkGetPhysicalDeviceSurfaceFormatsKHR */
...
};
到目前为止,这一切都说得通。用于在屏幕上绘制的图像格式是通常的每通道 8 位 BGRA。
作为我学习过程的一部分,到目前为止,我已经设置了很多东西,但还没有设置图形管道1。所以我正在尝试我可以使用的唯一一个不需要管道的命令:vkCmdClearColorImage
2。
VkClearColorValue
用于定义清晰颜色的 可以将颜色设为或,float
具体取决于图像的格式。根据提供给交换链的图像格式,我本来希望我应该给它赋值,但这似乎不正确。我知道是因为屏幕颜色没有改变。我试着给它,它有效。uint32_t
int32_t
uint32_t
float
我的问题是,为什么float
图像格式为 s 时需要在 s 中指定清晰的颜色VK_FORMAT_B8G8R8A8_UNORM
?
1 实际上我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长),特别是因为我在学习的同时也在编写关于它的教程。
2 实际上,从技术上讲,它不需要渲染通道,但我想嘿,我在这里没有使用任何管道的东西,所以让我们在没有管道的情况下尝试它,它可以工作。
我的渲染循环基本上如下:
- 从交换链获取图像
- 使用以下内容创建命令缓冲区:
- 从
VK_IMAGE_LAYOUT_UNDEFINED
到过渡VK_IMAGE_LAYOUT_GENERAL
(因为我正在清除渲染通道之外的图像) - 清除图像
- 过渡
VK_IMAGE_LAYOUT_GENERAL
到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 从
- 将命令缓冲区提交到队列(注意与带信号量的交换链的同步)
- 提交演示