Surface格式是B8G8R8A8_UNORM,但是vkCmdClearColorImage需要float?
Surface format is B8G8R8A8_UNORM, but vkCmdClearColorImage takes float?
我使用 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
s 并且它起作用了。
我的问题是,为什么在图片格式为VK_FORMAT_B8G8R8A8_UNORM
的情况下,在float
s中需要指定清晰的颜色?
1 实际上我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长),特别是因为我也在学习 tutorials on it。
2 实际上,它在技术上不需要渲染通道,但我想嘿,我在这里没有使用任何管道,所以让我们在没有管道的情况下尝试它并且它有效。
我的渲染循环基本上如下:
- 从交换链获取图像
- 使用以下内容创建命令缓冲区:
- 从
VK_IMAGE_LAYOUT_UNDEFINED
到 VK_IMAGE_LAYOUT_GENERAL
的过渡(因为我正在清除渲染过程之外的图像)
- 清除图像
- 从
VK_IMAGE_LAYOUT_GENERAL
过渡到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 将命令缓冲区提交到队列(注意与带有信号量的交换链同步)
- 提交演示
My question is, why does the clear color need to be specified in floats when the image format is VK_FORMAT_B8G8R8A8_UNORM?
因为 normalized、缩放或 sRGB 图像格式实际上只是浮点压缩的各种形式。规范化整数是一种在 [0, 1] 或 [-1, 1] 范围内存储浮点值的方法,但使用的数据量甚至比 16 位浮点数少得多。缩放整数是一种在 [0, MAX] 或 [-MIN, MAX] 范围内存储浮点值的方法。 sRGB 只是一种在 [0, 1] 范围内存储线性颜色值的压缩方式,但在经过伽马校正的颜色 space 中,它会将精度放在与线性颜色值所建议的不同的位置。
对于顶点着色器的输入,您会看到相同的情况。 vec4
输入类型可以由规范化格式提供,也可以由浮点格式提供。
我使用 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
s 并且它起作用了。
我的问题是,为什么在图片格式为VK_FORMAT_B8G8R8A8_UNORM
的情况下,在float
s中需要指定清晰的颜色?
1 实际上我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长),特别是因为我也在学习 tutorials on it。
2 实际上,它在技术上不需要渲染通道,但我想嘿,我在这里没有使用任何管道,所以让我们在没有管道的情况下尝试它并且它有效。
我的渲染循环基本上如下:
- 从交换链获取图像
- 使用以下内容创建命令缓冲区:
- 从
VK_IMAGE_LAYOUT_UNDEFINED
到VK_IMAGE_LAYOUT_GENERAL
的过渡(因为我正在清除渲染过程之外的图像) - 清除图像
- 从
VK_IMAGE_LAYOUT_GENERAL
过渡到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 从
- 将命令缓冲区提交到队列(注意与带有信号量的交换链同步)
- 提交演示
My question is, why does the clear color need to be specified in floats when the image format is VK_FORMAT_B8G8R8A8_UNORM?
因为 normalized、缩放或 sRGB 图像格式实际上只是浮点压缩的各种形式。规范化整数是一种在 [0, 1] 或 [-1, 1] 范围内存储浮点值的方法,但使用的数据量甚至比 16 位浮点数少得多。缩放整数是一种在 [0, MAX] 或 [-MIN, MAX] 范围内存储浮点值的方法。 sRGB 只是一种在 [0, 1] 范围内存储线性颜色值的压缩方式,但在经过伽马校正的颜色 space 中,它会将精度放在与线性颜色值所建议的不同的位置。
对于顶点着色器的输入,您会看到相同的情况。 vec4
输入类型可以由规范化格式提供,也可以由浮点格式提供。