2016-08-20 137 views
0

我想创建一个采用多个纹理的函数,并将它们追加并将它们贴在一起。举例来说,如果我有IMGA,IMGB,IMGC我能得到这样的质地:使用HLSL添加纹理

AAB

CBB

BCA

而且图像不必是相同的大小,所以我可能得到这样的:

AABç

CBB

BAC C

有没有人如何在HLSL中做到这一点,我应该看什么功能?你有任何语法的例子吗?

谢谢:)

编辑: 我不太满意的解答,我会更深入探索他们,然后回来这个问题

回答

1

运行在HLSL像素着色器循环不是最好的主意。流化对应于所需平铺纹理的顶点可能更容易。

首先,您需要创建一个纹理图集,即包含所有要编写的纹理的大纹理。然后,按照所需的布置渲染一个四边形(2个三角形)。

  • 您可以使用n Draw调用:一次一个quad。

  • 您可以使用预先计算或部分计算的图块位置制作一个大顶点缓冲区,并使用一个Draw调用。您可以拨打DrawInstanced电话。这是基于瓦片的地图在大多数游戏中的渲染方式。


如果你不希望创建一个纹理图集,可以在每次基本纹理传递给一个单独的采样,然后映射纹理坐标适当的采样。但是,这增加了像素着色器的分支,这也将降低性能。

+0

好的,谢谢,地图集概念看起来很有趣。你推荐任何教程?这是我第一次尝试着色着色器,任何东西都可以帮助 –

+1

循环不再那么糟糕,并且GPU足够灵活以查看需要的大部分资源,例如Bindless纹理允许您绑定所有纹理,而不管有格式和大小,并从HLSL中选择一个你需要的内容,无论是从间接纹理,顶点属性等等。但在OP问题中,它不会做任何好的传统解决方案,在四边形的顶点切割屏幕纹理是最简单的。 – galop1n

0

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

单独绑定每个纹理并将四边形渲染到正确的位置(甚至是最薄弱的硬件)可能绝对没有性能损失。

+0

有趣的方法,所以你说我不必在着色器中这样做,我可以使用普通脚本来做到这一点,并且只是脚本几何体本身。但是这不会增加平局吗? –

+0

你认为会有多少个平局呼叫?即使你在屏幕上有一千个独特的瓷砖纹理,如果你做得正确,只有一个纹理在两者之间变化而不是着色器,那么一千次绘制调用并不坏。你应该首先专注于获得某些工作,然后优化是否存在性能问题,使用图集或其他。 – galop1n