在HLSL中更改纹理

时间:2013-02-01 00:17:50

标签: xna textures

float4x4 WVP;
texture cubeTexture;

sampler TextureSampler = sampler_state
{
texture = <cubeTexture>;
MipFilter = Point;
MagFilter = Point;
MinFilter = Point;
AddressU = Wrap;
AddressV = Wrap;
MaxAnisotropy = 16;
};

所以,如果我没有弄错,这会告诉采样器状态我正在使用什么纹理。 我正在为许多精灵使用一个效果文件,因此这允许我使用一个纹理(图集)。 我可以把我所有纹理的地图集合成一个大爸爸地图集,但我担心这些并发症。

有没有办法让像素着色器通过其参数使用某个纹理? 我是HLSL的新手,对我来说很困惑。

2 个答案:

答案 0 :(得分:5)

如果你为着色器提供一个语义来引用寄存器,就像这样

// HLSL
sampler TextureSampler : register(s1);

然后,您可以使用游戏代码中的GraphicsDevice.Textures属性在代码中指定纹理

// C#
Texture2D texture2D = Content.Load<Texture2D>("contentfile");
graphicsDevice.Textures[1] = texture2D;

我使用寄存器1而不是0,因为Spritebatch.Draw()中的纹理参数使用寄存器0.如果你不是spritebatching,请随意使用寄存器0;

答案 1 :(得分:0)

您可以编写包含多个纹理和采样器的着色器,但这不是很有效。纹理图集更受欢迎,因为它更容易避免分支。

我建议,对于使用4种不同的纹理,每个顶点都有一个额外的颜色,颜色的每个部分(r,g,b,a)都可以用来混合纹理。然后,您可以在C#中设置此额外颜色的值,并在着色器中使用它。

这不是最佳的,因为它可以实现4 *纹理采样的数量,但它可能会起作用,具体取决于具体情况。

var c1 = Tex2D(texture1, texcoords) * extracolor.r;
var c2 = Tex2D(texture2, texcoords) * extracolor.g;
var c3 = Tex2D(texture3, texcoords) * extracolor.b;
var c4 = Tex2D(texture4, texcoords) * extracolor.a;

output.color = c1 + c2 + c3 + c4;
相关问题