使用 HLSL 附加纹理

问题描述 投票:0回答:2

我想创建一个函数,它接受多个纹理并将它们附加并将它们彼此相邻平铺。例如,如果我有 imgA、imgB、imgC,我可以获得这样的纹理:

A A B

C B B

B C A

图像也不必具有相同的大小,所以我可能会得到这样的结果:

AAB C

C B B

BAC C

有谁知道我如何在 HLSL 中做到这一点,我应该查看哪些功能?有语法示例吗?

谢谢你:)

编辑: 我对答案还不太满意,我会更深入地探索它们,然后回到这个问题

directx hlsl
2个回答
1
投票

在 HLSL 像素着色器中运行循环并不是最好的主意。传输与所需平铺纹理相对应的顶点可能更容易。

首先,您需要创建一个纹理图集,即包含您想要组成的所有纹理的大纹理。然后按照所需的排列渲染一个又一个四边形(2 个三角形)。

  • 您可以使用 n 个

    Draw
    调用:一次一个四元组。

  • 您可以使用预先计算或部分计算的图块位置创建一个大顶点缓冲区,并使用一个

    Draw
    调用。

  • 或者您可以拨打一个

    DrawInstanced
    电话。这就是大多数游戏中基于图块的地图的渲染方式。


如果您不想创建纹理图集,则可以将每个基础纹理传递到单独的采样器,然后将纹理坐标映射到适当的采样器。然而,这会增加像素着色器的分支,这也会降低性能成本。


0
投票

这个问题有点宽泛,有很多方法可以做到你所描述的。一些解决方案可能会使用大型超级着色器并将大部分逻辑嵌入到 hlsl 中,但这似乎并不正确且复杂。为屏幕的每个部分混合一些生成的几何图形会更经济。

单独绑定每个纹理并将四边形渲染到正确的位置可能绝对不会有任何性能损失,即使是最弱的硬件也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.