ピクセルシェーダを背景スプライトに適用して、ある種の照明を作成したいとします。 それで、ライトでレンダーターゲットを描画し、Pixelシェーダーを介してバックグラウンドにマージしたいと思います。 これは必須コードである:この場合XNAピクセルシェーダクランプエラー
GraphicsDevice.Clear(Color.Black);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
lighting.Parameters["lightMask"].SetValue(lightingMask);
lighting.CurrentTechnique.Passes[0].Apply();
spriteBatch.Draw(hexBack, new Vector2(0, 0), Color.White);
spriteBatch.End();
、hexBackそれに描かれた単純なスプライトとレンダーターゲットとlightingMaskは、その中に光テクスチャとレンダーターゲットです。 どちらもバックバッファの幅と高さです。
したがって、プログラムを実行しようとすると、次のようにクラッシュします。 XNA Framework Reachプロファイルでは、2の累乗ではないテクスチャサイズを使用する場合、TextureAddressModeをクランプする必要があります。
私は締め付けを設定しようとしましたが、それを働かせる方法が見つかりません。
シェーダコード:あなたの助けのための
texture lightMask;
sampler mainSampler : register(s0);
sampler lightSampler = sampler_state{Texture = lightMask;};
struct PixelShaderInput
{
float4 TextureCoords: TEXCOORD0;
};
float4 PixelShaderFunction(PixelShaderInput input) : COLOR0
{
float2 texCoord = input.TextureCoords;
float4 mainColor = tex2D(mainSampler, texCoord);
float4 lightColor = tex2D(lightSampler, texCoord);
return mainColor * lightColor;
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
ありがとう!
pcnx
です。@Elideb:それをバックアップするための参照がありますか? XNAは2の累乗にパディングしなければならないので(つまり、折り返しは機能しません)、Power-of-2以外のテクスチャを使用する場合のメモリペナルティ(パフォーマンスではない)があるだけです。実際にラッピングを使用していない限り、ルックは影響を受けるべきではありません。 –
また、@pcnx、 'SpriteBatch.Begin'はデフォルトで' LinearClamp'を使います。だからあなたは 'LinearWrap'やそれ以外のコードのどこかに設定する必要がありますか? –
@AndrewRussell:私は安いカードで過去の経験から描いていた。コメントは削除されました。 – Elideb