2013-02-01 63 views
2
float4x4 WVP; 
texture cubeTexture; 

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

所以,如果我没有弄错,这告诉采样器状态我使用的纹理。 我对许多许多精灵都使用了一个效果文件,因此这允许我使用一个纹理(图集)。 我可以将我所有的纹理地图集合到一个大爸爸地图集中,但我担心这些并发症。更改HLSL中的纹理

有没有办法告诉像素着色器使用其参数使用特定的纹理? 我是HLSL的新手,对我很困惑。

+0

你需要一个[Texture2dArray](https://msdn.microsoft.com/en-us/library/windows/desktop/bb509699(V = vs.85)的.aspx),选择那些。 –

回答

5

如果你给你的shader语义引用一个寄存器,像这样

// 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;

+0

我最终什么事做了实例化元,并有“批”为每个精灵表,并绘制我想要的精灵到原始的,这样我就可以到处画一大堆对象的无并发症 –

0

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

我建议,对于使用4个不同的纹理,具有上,其中颜色的每个部分(R,G,B,A)可被用于混合的纹理每个VERT一个额外的颜色。然后,您将在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; 
+0

感谢您的答案的家伙,我我仍然对hsls感到困惑,但我会弄清楚。 –