我vkGetPhysicalDeviceSurfaceFormatsKHR过去常常为交换链获取支持的图像格式,并且(在 Linux + Nvidia 上,使用 SDL)我将其VK_FORMAT_B8G8R8A8_UNORM作为第一个选项,然后继续使用该格式创建交换链:
VkSwapchainCreateInfoKHR swapchain_info = {
...
.imageFormat = format, /* taken from vkGetPhysicalDeviceSurfaceFormatsKHR */
...
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,这一切都说得通。用于在屏幕上绘制的图像格式是通常的每通道 8 位 BGRA。
作为我学习过程的一部分,到目前为止,我已经设置了很多东西,但还没有设置图形管道1。所以我正在尝试我可以使用的唯一不需要管道的命令:vkCmdClearColorImage2。
所述VkClearColorValue用于定义明确颜色可以采取的颜色float,uint32_t或者int32_t,根据图像的格式。根据提供给交换链的图像格式,我本来希望我应该给它uint32_t值,但这似乎不正确。我知道是因为屏幕颜色没有改变。我试着给它floats 并且它有效。
我的问题是,为什么float图像格式为 s 时需要在s 中指定 clear color VK_FORMAT_B8G8R8A8_UNORM?
1 其实我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长性),特别是因为我也在学习时编写有关它的教程。
2 实际上,它在技术上不需要渲染通道,但我想嘿,我在这里没有使用任何管道的东西,所以让我们在没有管道的情况下尝试它并且它起作用了。
我的渲染循环本质上如下:
VK_IMAGE_LAYOUT_UNDEFINEDto过渡VK_IMAGE_LAYOUT_GENERAL(因为我正在清除渲染通道外的图像)VK_IMAGE_LAYOUT_GENERAL到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR我的问题是,当图像格式为VK_FORMAT_B8G8R8A8_UNORM时,为什么需要在浮点数中指定清晰颜色?
因为归一化、缩放或 sRGB 图像格式实际上只是浮点压缩的各种形式。规范化整数是一种存储 [0, 1] 或 [-1, 1] 范围内的浮点值的方法,但使用的数据量甚至比 16 位浮点要少得多。缩放整数是存储 [0, MAX] 或 [-MIN, MAX] 范围内的浮点值的一种方式。sRGB 只是一种存储 [0, 1] 范围内线性颜色值的压缩方式,但在伽马校正颜色空间中,其精度与线性颜色值建议的位置不同。
您会在顶点着色器的输入中看到相同的情况。输入vec4类型可以由标准化格式以及浮点格式提供。
| 归档时间: |
|
| 查看次数: |
2494 次 |
| 最近记录: |