2
float4x4 WVP;
texture cubeTexture;

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

因此,如果我没记错的话,这会告诉采样器状态我正在使用什么纹理。我为许多精灵使用一个效果文件,因此这允许我使用一种纹理(图集)。而且我可以将我所有的纹理图集合并到一个大爸爸图集中,但我担心会出现并发症。

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

4

2 回答 2

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;

于 2013-02-01T01:34:25.477 回答
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;
于 2013-02-01T13:00:00.150 回答