gpt4 book ai didi

texture-mapping - 多个网格上的Vulkan纹理渲染

转载 作者:行者123 更新时间:2023-12-04 06:16:32 27 4
gpt4 key购买 nike

我正在为一个模型的多个网格渲染不同的纹理,但是我对程序没有太多的了解。有人建议为每个网格创建自己的描述符集,并调用vkCmdBindDescriptorSets()和vkCmdDrawIndexed()进行渲染,如下所示:

    // Pipeline with descriptor set layout that matches the shared descriptor sets
vkCmdBindPipeline(...pipelines.mesh...);
...
// Mesh A
vkCmdBindDescriptorSets(...&meshA.descriptorSet... );
vkCmdDrawIndexed(...);
// Mesh B
vkCmdBindDescriptorSets(...&meshB.descriptorSet... );
vkCmdDrawIndexed(...);

但是,上述方法与斩波器样本和vulkan样本完全不同,这使我不知道从哪里开始更改。我非常感谢您为我提供正确指导的帮助。

干杯

最佳答案

您有一个由多个具有不同纹理需求的网格组成的概念对象。解决此问题的一般方法是:

  • 在对象的各个部分之间更改描述符集。很痛苦,但是它可以在所有支持Vulkan的硬件上使用。
  • 使用数组纹理。每个单独的网格都从阵列纹理中的特定层获取其数据。当然,这将限制您让每个子网格使用相同大小的纹理。但是它可以在所有支持Vulkan的硬件上运行(最少128个数组元素)。可以将特定网格的数组层提供为push-constant或基础实例(如果可用)。

    请注意,如果您设法能够通过基本实例执行此操作,则可以使用多绘制间接命令来渲染整个对象。虽然目前尚不清楚短的多绘制间接调用是否比仅将一小段绘制命令烘焙到命令缓冲区中更快。
  • 按照Sascha Willems的建议使用采样器数组。大概,子网格的数组索引是作为推常数或多次绘制的绘制索引提供的。问题在于,无论如何提供该数组索引,它都必须是动态统一的表达式。而且,不需要Vulkan实现即可允许您使用动态统一的表达式为采样器数组建立索引。基本要求只是一个常量表达式。

    这将您限制在支持shaderSampledImageArrayDynamicIndexing功能的硬件上。因此,您必须要求它,如果它不可用,则必须使用#1或#2解决该问题。或者只是不要在该硬件上运行。但是最后一个意味着您无法在任何移动硬件上运行,因为most of them don't support this feature至今。

    请注意,我并不是说您不应该使用此方法。我只想让您知道这是有成本的。有很多硬件无法做到这一点。因此,您需要为此进行计划。
  • 关于texture-mapping - 多个网格上的Vulkan纹理渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36772607/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com