2013-02-01 62 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感到困惑,但我會弄清楚。 –