表面格式是B8G8R8A8_UNORM,但vkCmdClearColorImage是否浮动?

时间:2016-05-06 02:47:28

标签: vulkan

我使用vkGetPhysicalDeviceSurfaceFormatsKHR获取交换链支持的图像格式,并且(在Linux + Nvidia上,使用SDL)我得到VK_FORMAT_B8G8R8A8_UNORM作为第一个选项,我继续创建交换链格式:

VkSwapchainCreateInfoKHR swapchain_info = {
    ...
    .imageFormat = format, /* taken from vkGetPhysicalDeviceSurfaceFormatsKHR */
    ...
};

到目前为止,这一切都有道理。用于在屏幕上绘制的图像格式通常是每通道8位BGRA。

作为我学习过程的一部分,到目前为止,我已经开始设置很多东西但尚未使用图形管道 1 。所以我正在尝试我可以使用的唯一一个不需要管道的命令:vkCmdClearColorImage 2

用于定义清晰颜色的VkClearColorValue可以将颜色设置为floatuint32_tint32_t,具体取决于图片的格式。基于交换链给出的图像格式,我原本期望我应该给它uint32_t值,但这看起来并不正确。我知道,因为屏幕颜色没有变化。我试着给它float,它有效。

我的问题是,为什么当图像格式为float时,需要在VK_FORMAT_B8G8R8A8_UNORM s中指定清晰的颜色?

1 实际上我有,但我想我会先尝试一下没有管道的简单情况。我试图逐渐使用Vulkan(考虑到它的冗长),特别是因为我在学习时也写tutorials on it

2 实际上,它在技术上并不需要渲染过程,但是我觉得嘿,我没有在这里使用任何管道,所以让我们来看看。没有管道尝试它,它工作。

我的渲染循环基本上如下:

  • 从swapchain获取图片
  • 使用以下命令创建命令缓冲区:
    • VK_IMAGE_LAYOUT_UNDEFINED过渡到VK_IMAGE_LAYOUT_GENERAL(因为我在渲染过程之外清除图像)
    • 清除图像
    • VK_IMAGE_LAYOUT_GENERAL过渡到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
  • 将命令缓冲区提交到队列(使用信号量与swapchain同步)
  • 提交演示文稿

1 个答案:

答案 0 :(得分:3)

  

我的问题是,当图像格式为VK_FORMAT_B8G8R8A8_UNORM时,为什么需要在浮点数中指定清晰的颜色?

因为normalized,缩放或sRGB图像格式实际上只是各种形式的浮点压缩。归一化整数是一种在[0,1]或[-1,1]范围内存储浮点值的方法,但使用的数据量远远少于16位浮点数。缩放整数是一种在[0,MAX]或[-MIN,MAX]范围内存储浮点值的方法。而sRGB只是一种压缩方式,可以在[0,1]范围内存储线性颜色值,但是在经过伽马校正的颜色空间中,精度位于不同于线性颜色值的位置。

您可以通过顶点着色器的输入看到相同的内容。 vec4输入类型可以通过标准化格式以及浮点格式提供。