为什么 VkImageView 格式与底层 VkImage 格式不同?
Why would VkImageView format differ from the underlying VkImage format?
VkImageCreateInfo
有以下成员:
VkFormat format;
和VkImageViewCreateInfo
有相同的成员。
我不明白为什么 VkImageView
中的格式与创建它所需的 VkImage
中的格式不同。
我理解某些格式 are compatible with one another,但我不知道您为什么要使用其中一种替代格式
与很多 Vulkan 一样,API 旨在展示硬件的功能。内存布局(图像)和将该内存解释为数据(图像视图)是硬件中的不同概念,因此 API 暴露了这一点。 API 公开它只是因为这就是硬件的工作方式,而 Vulkan 被设计为一个精简的抽象; API 可以做到并不意味着您需要使用它 ;)
正如你所说,在大多数情况下它并没有那么有用...
我认为在某些情况下它可能更有效,例如让计算着色器为某些类型的图像处理生成整数数据比浮点计算或手动规范化整数数据以创建更节能不规范的数据。使用别名,计算着色器可以直接编写例如uint8
整数和片段着色器可以读取与 unorm8
数据相同的数据
规范用例和主要原始动机(在 D3D10 中,这个想法的起源地)是使用单个图像作为 R8G8B8A8_UNORM
或 R8G8B8A8_SRGB
-- 因为它在不同的位置包含不同的内容次,或者因为有时您想在没有线性化的情况下在 sRGB-space 中操作。
更一般地说,有时在不同时间在图像对象中包含不同的 "types" 内容是很有用的——这为引擎提供了一种有限形式的内存别名,并在完整的几年前被引入图形 API -特色内存别名是一回事。
VkImageCreateInfo
有以下成员:
VkFormat format;
和VkImageViewCreateInfo
有相同的成员。
我不明白为什么 VkImageView
中的格式与创建它所需的 VkImage
中的格式不同。
我理解某些格式 are compatible with one another,但我不知道您为什么要使用其中一种替代格式
与很多 Vulkan 一样,API 旨在展示硬件的功能。内存布局(图像)和将该内存解释为数据(图像视图)是硬件中的不同概念,因此 API 暴露了这一点。 API 公开它只是因为这就是硬件的工作方式,而 Vulkan 被设计为一个精简的抽象; API 可以做到并不意味着您需要使用它 ;)
正如你所说,在大多数情况下它并没有那么有用...
我认为在某些情况下它可能更有效,例如让计算着色器为某些类型的图像处理生成整数数据比浮点计算或手动规范化整数数据以创建更节能不规范的数据。使用别名,计算着色器可以直接编写例如uint8
整数和片段着色器可以读取与 unorm8
数据相同的数据
规范用例和主要原始动机(在 D3D10 中,这个想法的起源地)是使用单个图像作为 R8G8B8A8_UNORM
或 R8G8B8A8_SRGB
-- 因为它在不同的位置包含不同的内容次,或者因为有时您想在没有线性化的情况下在 sRGB-space 中操作。
更一般地说,有时在不同时间在图像对象中包含不同的 "types" 内容是很有用的——这为引擎提供了一种有限形式的内存别名,并在完整的几年前被引入图形 API -特色内存别名是一回事。