vulkan - Vulkan vkCmdDrawIndexedIndirect 如何为每个内部绘制命令使用不同的纹理

标签 vulkan

例如,我有 10k 个网格要渲染,每个网格都会附加不同的纹理。同样,纹理具有不同的分辨率,因此不能排列在纹理数组中。每帧都会选择并渲染 10k 网格的子集。

通过先前的变换反馈渲染 channel 构造间接绘制命令缓冲区,我可以在另一个绘制调用中渲染网格。问题是如何在绘制命令之间分配相关纹理。

在 OpenGL 中,通过提供 uivec2 格式的纹理句柄,可以通过无绑定(bind)纹理功能访问不同的纹理。

但是,在 Vulkan 中,不包含无绑定(bind)功能。我是否应该放弃间接绘制例程,并每帧记录一个大的命令缓冲区,并在循环中更新描述符的背面图像?或者,我应该创建一个数组描述符,将不同的图像分配给元素,并通过循环中的推送常量更新纹理 ID?或者,还有更好的解决方案吗?

谢谢!

最佳答案

如果您设置不重新缩放纹理以使它们适合数组纹理,那么您可以创建采样器数组。一般情况下都是这样处理的。

在 Vulkan 中,数组描述符被视为数组基本类型的单个描述符。因此,您可以将所有相关纹理附加到这个单个描述符,为每个模型分配数组中的一个位置。

顶点着色器的 DrawIndex 输入(需要 shaderDrawParamters 功能/扩展)告诉您间接调用中哪个绘图命令创建了该顶点。因此,您可以使用它来获取每个模型的数据,其中包括该模型的纹理索引。另外,索引是动态统一的,这很好,因为您需要它。

当然,为了做到这一点,您的 Vulkan 实现必须支持 shaderSampledImageArrayDynamicIndexing。大多数桌面实现都这样做,但很少有非桌面实现这样做。

关于vulkan - Vulkan vkCmdDrawIndexedIndirect 如何为每个内部绘制命令使用不同的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401132/

相关文章:

vulkan - Vulkan 计算着色器缓存和屏障

qt - 使用 Vulkan 渲染 Qml

clang - 如何使用 Clang 将 OpenCL 内核编译为 SPIR-V

c++ - 尽管支持 vkCreateImage 返回 VK_ERROR_INITIALIZATION_FAILED

multithreading - 多线程中的 Vulkan 队列同步

c++ - 如何正确设置 Vk Debug Utils Messenger tEXT?

c++ - 在 Vulkan 中加载非二次幂纹理

glsl - Vulkan 是否支持着色器中的原子浮点操作?

c++ - 无法从压缩纹理数据创建图像 (S3TC)

c++ - 在结构中使用 Vulkan 唯一句柄会导致 "implicitly deleted"错误