我使用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
时,需要在VK_FORMAT_B8G8R8A8_UNORM
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
答案 0 :(得分:3)
我的问题是,当图像格式为VK_FORMAT_B8G8R8A8_UNORM时,为什么需要在浮点数中指定清晰的颜色?
因为normalized,缩放或sRGB图像格式实际上只是各种形式的浮点压缩。归一化整数是一种在[0,1]或[-1,1]范围内存储浮点值的方法,但使用的数据量远远少于16位浮点数。缩放整数是一种在[0,MAX]或[-MIN,MAX]范围内存储浮点值的方法。而sRGB只是一种压缩方式,可以在[0,1]范围内存储线性颜色值,但是在经过伽马校正的颜色空间中,精度位于不同于线性颜色值的位置。
您可以通过顶点着色器的输入看到相同的内容。 vec4
输入类型可以通过标准化格式以及浮点格式提供。