2011-07-31 8 views
0

ピクセルシェーダを背景スプライトに適用して、ある種の照明を作成したいとします。 それで、ライトでレンダーターゲットを描画し、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

+0

です。@Elideb:それをバックアップするための参照がありますか? XNAは2の累乗にパディングしなければならないので(つまり、折り返しは機能しません)、Power-of-2以外のテクスチャを使用する場合のメモリペナルティ(パフォーマンスではない)があるだけです。実際にラッピングを使用していない限り、ルックは影響を受けるべきではありません。 –

+0

また、@pcnx、 'SpriteBatch.Begin'はデフォルトで' LinearClamp'を使います。だからあなたは 'LinearWrap'やそれ以外のコードのどこかに設定する必要がありますか? –

+0

@AndrewRussell:私は安いカードで過去の経験から描いていた。コメントは削除されました。 – Elideb

答えて

0

エラーがアドレッシングモードをお使いのテクスチャを参照する(すなわち:テクスチャが縁で折り返すない、またはそれが縁でクランプされています)。シェーダとは関係ありません。 SpriteBatch.Beginため

使用過負荷の一方( MSDNSamplerStateをとり、 SamplerState.LinearClampMSDN)に渡します。あなたのコードのどこかのグラフィックスデバイスに:あなたは別の状態( LinearWrapなど)を設定する必要がありますので、

SpriteBatch.Beginのデフォルトは、SamplerState.LinearClampありますか?それをしないでください。

(代わりに:プロジェクトの設定でHiDefプロファイルへのリーチプロファイルからの変更)

0

あなたが2つのテクスチャの電源を使用することができない場合、あなたはあなたのSpritebath.beginコールとspecify a SamplerStateを変更する必要があります。指定する最小値は

public void Begin (
     SpriteSortMode sortMode, 
     BlendState blendState, 
     SamplerState samplerState, 
     DepthStencilState depthStencilState, 
     RasterizerState rasterizerState 
)