当前位置: 首页 > 知识库问答 >
问题:

多网格上的Vulkan纹理渲染

闻鹤龄
2023-03-14

我正在模型的多个网格上渲染不同的纹理,但是我对程序没有太多的线索。有人建议为每个网格创建自己的描述符集,并调用vkCmdBindInvptorSets()和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(...);

然而,上面的方法与chopper样本和vulkan样本有很大不同,这让我不知道从哪里开始改变。我真的很感激任何能帮我找到正确方向的帮助。

干杯

共有2个答案

周祺
2023-03-14

我猜,提出上述代码片段的人就是我;)

这只是一种方法。你不必为每个网格或纹理创建一个描述符集。如果你的网格使用4种不同的纹理,你可以一次将它们绑定到不同的绑定点,并在着色器中选择它们。

如果你看一看NVIDIA的斩波器样本,他们的方式基本相同,只是有了更多的抽象。

该示例还为使用的纹理设置描述符集:

VkDescriptorSet *textureDescriptors = m_renderer->getTextureDescriptorSets();

将它们绑定到几行之后:

VkDescriptorSet sets[3] = { sceneDescriptor, textureDescriptors[0], m_transform_descriptor_set };
vkCmdBindDescriptorSets(m_draw_command[inCommandIndex], VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, 3, sets, 0, NULL);

然后使用绑定描述符集渲染网格:

vkCmdDrawIndexedIndirect(m_draw_command[inCommandIndex], sceneIndirectBuffer, 0, inCount, sizeof(VkDrawIndexedIndirectCommand));
vkCmdDraw(m_draw_command[inCommandIndex], 1, 1, 0, 0);

如果你看一下initDescriptorSet,你会发现它们也为立方体地图、地形等创建了单独的描述符集。

LunarG的例子应该是相似的,但是如果我没弄错的话,它们从来没有使用过一个以上的纹理?

益阳平
2023-03-14

你有一个概念对象,它由多个网格组成,这些网格有不同的纹理需求。处理这个问题的一般方法是:

>

使用数组纹理。每个单独的网格从数组纹理中的特定层获取数据。当然,这限制了您让每个子网格使用相同大小的纹理。但是它适用于所有支持Vulkan的硬件(至少128个数组元素)。特定网格的数组层可以作为推送常量提供,如果有的话,也可以作为基本实例提供。

请注意,如果您能够通过基本实例来完成,那么您可以使用多绘制间接命令来呈现整个对象。尽管还不清楚短的多绘制间接命令是否比仅仅将短的绘制命令序列烘焙到命令缓冲区中更快。

正如Sascha Willems建议的那样,使用采样器阵列。据推测,子网格的数组索引是作为push常量或multi-draw的draw索引提供的。问题是,不管数组索引是如何提供的,它都必须是一个动态统一的表达式。Vulkan实现不需要允许您使用动态统一表达式索引采样器数组。基本需求只是一个常量表达式。

这将限制您使用支持着色器采样ImageArrayDynamicIndexing功能的硬件。所以你必须提出要求,如果没有,那么你必须用#1或#2来解决这个问题。或者就是不要在那个硬件上运行。但最后一个问题意味着你不能在任何移动硬件上运行,因为大多数移动硬件目前还不支持这个功能。

请注意,我并不是说你不应该使用这种方法。我只是想让你知道这是有代价的。有很多硬件都做不到这一点。所以你需要为此做计划。

 类似资料:
  • 渲染纹理是一张在 GPU 上的纹理。通常我们会把它设置到相机的 目标纹理 上,使相机照射的内容通过离屏的 frambuffer 绘制到该纹理上。一般可用于制作汽车后视镜,动态阴影等功能。 使用 RenderTexture // 方法一:把 3D 相机照射的内容绘制到 UI 的精灵帧上 export class CaptureToWeb extends Component { @proper

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位

  • 我试图弄清楚为什么我不能用LWJGL 3渲染任何纹理。我尝试了多种加载(PNGDecoder、STB、BufferedImage)和渲染纹理的方法。但结果总是一个白色的四边形。 主要类: 加载方法: 渲染方法: ModelTexture类只是存储一些现在不使用的信息,blue.png是16x16的png文件。 这是我在启动程序时得到的输出:

  • 方法 构造函数 参数 类型 名称 备注 width number 宽 height number 高 返回值: 类型 名称 备注 Object BK.RenderTexture对象 例子: var renderTexture = new BK.RenderTexture(BK.Director.screenPixelSize.width, BK.Director.screenPixelSize.h

  • 我正在尝试使用OpenGL GLSL着色器渲染到纹理。首先,我尝试用白色填充30x30纹理的每个像素。我将顶点着色器索引从0传递到899,表示纹理的每个像素。对吗?顶点着色器: 片段着色器:

  • 我正在修改锻造模型,我的物品不会被渲染。以下是错误: 这里有一些有用的文件...ItemSkygem.json