我想创建一个函数,该函数采用多个纹理并将它们附加并彼此相邻平铺。例如,如果我有 imgA、imgB、imgC,我可以得到这样的纹理:
AAB
CBB
BCA
图像也不必是相同的大小,所以我可能会得到这样的东西:
AAB C
CBB
BAC C
有谁可以在 HLSL 中做到这一点,我应该查看哪些功能?你有任何语法示例吗?
谢谢 :)
编辑:我对答案还不太满意,我将更深入地探索它们,然后回到这个问题
我想创建一个函数,该函数采用多个纹理并将它们附加并彼此相邻平铺。例如,如果我有 imgA、imgB、imgC,我可以得到这样的纹理:
AAB
CBB
BCA
图像也不必是相同的大小,所以我可能会得到这样的东西:
AAB C
CBB
BAC C
有谁可以在 HLSL 中做到这一点,我应该查看哪些功能?你有任何语法示例吗?
谢谢 :)
编辑:我对答案还不太满意,我将更深入地探索它们,然后回到这个问题
在 HLSL 像素着色器中运行循环并不是最好的主意。流式传输与所需平铺纹理相对应的顶点可能更容易。
首先,您需要创建一个纹理图集,即一个包含您要合成的所有纹理的大纹理。然后以所需的排列顺序渲染一个四边形(2 个三角形)。
您可以使用 n 个Draw
调用:一次一个四边形。
您可以使用预先计算或部分计算的平铺位置制作一个大的顶点缓冲区,并使用一次Draw
调用。
或者你可以打一个DrawInstanced
电话。这就是大多数游戏中基于图块的地图的渲染方式。
如果您不想创建纹理图集,可以将每个基础纹理传递给单独的采样器,然后将纹理坐标映射到适当的采样器。然而,这增加了像素着色器的分支,这也将提高成本性能。
这个问题有点宽泛,有很多方法可以做你描述的事情。一些解决方案可能会使用大型 uber 着色器并将大部分逻辑嵌入到 hlsl 中,但它似乎并不正确和复杂。为屏幕的每个部分混合一些生成的几何图形会更实惠。
单独绑定每个纹理并将四边形渲染到正确的位置,甚至是最弱的硬件,可能绝对没有性能损失。