例如,我有 10k 个网格要渲染,每个网格都会附加不同的纹理。同样,纹理具有不同的分辨率,因此不能排列在纹理数组中。每帧都会选择并渲染 10k 网格的子集。
通过先前的变换反馈渲染 channel 构造间接绘制命令缓冲区,我可以在另一个绘制调用中渲染网格。问题是如何在绘制命令之间分配相关纹理。
在 OpenGL 中,通过提供 uivec2 格式的纹理句柄,可以通过无绑定(bind)纹理功能访问不同的纹理。
但是,在 Vulkan 中,不包含无绑定(bind)功能。我是否应该放弃间接绘制例程,并每帧记录一个大的命令缓冲区,并在循环中更新描述符的背面图像?或者,我应该创建一个数组描述符,将不同的图像分配给元素,并通过循环中的推送常量更新纹理 ID?或者,还有更好的解决方案吗?
谢谢!
最佳答案
如果您设置不重新缩放纹理以使它们适合数组纹理,那么您可以创建采样器数组。一般情况下都是这样处理的。
在 Vulkan 中,数组描述符被视为数组基本类型的单个描述符。因此,您可以将所有相关纹理附加到这个单个描述符,为每个模型分配数组中的一个位置。
顶点着色器的 DrawIndex
输入(需要 shaderDrawParamters
功能/扩展)告诉您间接调用中哪个绘图命令创建了该顶点。因此,您可以使用它来获取每个模型的数据,其中包括该模型的纹理索引。另外,索引是动态统一的,这很好,因为您需要它。
当然,为了做到这一点,您的 Vulkan 实现必须支持 shaderSampledImageArrayDynamicIndexing
。大多数桌面实现都这样做,但很少有非桌面实现这样做。
关于vulkan - Vulkan vkCmdDrawIndexedIndirect 如何为每个内部绘制命令使用不同的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51401132/