每个内部绘制命令如何使用具有不同纹理的Vulkan vkCmdDrawIndexedIndirect

时间:2018-07-18 11:41:02

标签: vulkan

例如,我要渲染10k个网格,每个网格将附加不同的纹理。同样,纹理具有不同的分辨率,因此无法排列在纹理阵列中。每帧,将选择并渲染1万个网格的子集。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

如果设置不重新缩放纹理以使其适合数组纹理,则可以创建一个采样器数组。通常就是这样处理的。

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

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

当然,要完全做到这一点,您的Vulkan实现必须支持shaderSampledImageArrayDynamicIndexing。大多数台式机实现都可以,但是非台式机实现却很少。

相关问题