6

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

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

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

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

VkClearColorValue用于定义清晰颜色的 可以将颜色设为或,float具体取决于图像的格式。根据提供给交换链的图像格式,我本来希望我应该给它赋值,但这似乎不正确。我知道是因为屏幕颜色没有改变。我试着给它,它有效。uint32_tint32_tuint32_tfloat

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


1 实际上我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长),特别是因为我在学习的同时也在编写关于它的教程

2 实际上,从技术上讲,它不需要渲染通道,但我想嘿,我在这里没有使用任何管道的东西,所以让我们在没有管道的情况下尝试它,它可以工作。


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

  • 从交换链获取图像
  • 使用以下内容创建命令缓冲区:
    • VK_IMAGE_LAYOUT_UNDEFINED到过渡VK_IMAGE_LAYOUT_GENERAL(因为我正在清除渲染通道之外的图像)
    • 清除图像
    • 过渡VK_IMAGE_LAYOUT_GENERALVK_IMAGE_LAYOUT_PRESENT_SRC_KHR
  • 将命令缓冲区提交到队列(注意与带信号量的交换链的同步)
  • 提交演示
4

1 回答 1

4

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

因为归一化、缩放或 sRGB 图像格式实际上只是各种形式的浮点压缩。归一化整数是一种在 [0, 1] 或 [-1, 1] 范围内存储浮点值的方法,但使用的数据量甚至比 16 位浮点数要少得多。缩放整数是一种在 [0, MAX] 或 [-MIN, MAX] 范围内存储浮点值的方法。sRGB 只是在 [0, 1] 范围内存储线性颜色值的一种压缩方式,但是在伽马校正的颜色空间中,它会将精度放在与线性颜色值所建议的不同的位置。

您会在顶点着色器的输入中看到相同的内容。输入类型可以vec4由规范化格式和浮点格式提供。

于 2016-05-06T03:10:49.730 回答