在vulkan计算着色器中加载/存储到特定的mip级别



正如标题所示,我想在计算着色器中读写特定mip级别的特定像素。我知道在Vulkan方面,我可以指定我想在ImageView中处理多少mip级别,但我不确定这在glsl中是如何工作的。我可以使用单个image3D和单个ImageView:吗

layout(binding = 0, rgb8) uniform image3D img;

还是每个mip级别需要一个image2D,从而需要多个ImageViews?

layout(binding = 0, rgb8) uniform image2d mipLvl0;
layout(binding = 1, rgb8) uniform image2d mipLvl1;
layout(binding = 2, rgb8) uniform image2d mipLvl2;

由于两个imageLoad/Store都有一个采用ivec3的重载,我假设在第一种情况下我可以将mip级别指定为z坐标。

不能将mipmap金字塔视为单绑定描述符。

但是,您可以将金字塔中的每个mipmap绑定到阵列描述符:

layout(binding = 0, rgb8) uniform image2d img[3];

该描述符将被排列,这意味着该集合的绑定0的VkDescriptorSetLayoutBinding::descriptorCount在本例中将为3。您还必须将映像的每个mipmap绑定到描述符中的不同数组索引,因此该描述符的descriptorCountpImageInfo需要为vkUpdateDescriptorSet调用提供多个映像。数组元素的数量需要在着色器中说明,因此它不能动态更改(尽管如果着色器不访问它们,可以在描述符中保留一些未指定的元素(。

此外,您必须遵循实现的规则来索引不透明类型的数组。大多数桌面实现都允许这些是动态统一的表达式(并且您需要激活shaderStorageImageArrayDynamicIndexing功能(,因此您可以使用uniform变量而不是常量表达式。但这些表述不能是任意的;它们必须在单个draw调用中解析为相同的值。

此外,使用图像阵列并不能绕过着色器可以使用的图像数量的限制。然而,大多数桌面硬件都有这些限制。

最新更新