正如标题所示,我想在计算着色器中读写特定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绑定到描述符中的不同数组索引,因此该描述符的descriptorCount
和pImageInfo
需要为vkUpdateDescriptorSet
调用提供多个映像。数组元素的数量需要在着色器中说明,因此它不能动态更改(尽管如果着色器不访问它们,可以在描述符中保留一些未指定的元素(。
此外,您必须遵循实现的规则来索引不透明类型的数组。大多数桌面实现都允许这些是动态统一的表达式(并且您需要激活shaderStorageImageArrayDynamicIndexing
功能(,因此您可以使用uniform
变量而不是常量表达式。但这些表述不能是任意的;它们必须在单个draw调用中解析为相同的值。
此外,使用图像阵列并不能绕过着色器可以使用的图像数量的限制。然而,大多数桌面硬件都有这些限制。