2
float4x4 WVP;
texture cubeTexture;

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

ですから、私が間違っていなければ、これはサンプラーの状態に私が使用しているテクスチャーを伝えます。多くのスプライトに1つのエフェクトファイルを使用しているため、1つのテクスチャ(アトラス)を使用できます。そして、すべてのテクスチャアトラスを1つのグランドパパアトラスに組み合わせることができましたが、複雑さを恐れています。

パラメータによって特定のテクスチャを使用するようにピクセルシェーダに指示する方法はありますか?私はHLSLを初めて使用しますが、非常に混乱します。

4

2 に答える 2

5

シェーダーにレジスターを参照するセマンティクスを与えると、

// HLSL
sampler TextureSampler : register(s1);

GraphicsDevice.Textures次に、ゲームコードのプロパティを使用して、コードでテクスチャを割り当てることができます。

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

のテクスチャ引数はレジスタ0を使用するため、0ではなくレジスタ1を使用しましたSpritebatch.Draw()。スプライトバッチ処理を行っていない場合は、レジスタ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 に答える