2017-05-02 13 views
1

ピクセルシェーダを通過するテクスチャをレンダリングしようとしています。次のようにShader DirectX 9でテクスチャを渡す

現在、私のシェーダがある:

float4 EffectProcess(float2 Tex : TEXCOORD0) : COLOR0 
{ 
    return float4(1,0,0,1); 
} 

technique MyTechnique 
{ 
    pass p0 
    { 
     VertexShader = null; 
     PixelShader = compile ps_2_0 EffectProcess(); 
    } 
} 

あなたが見ることができるように、それはそれは赤にした画素を強制的になり、非常に基本的なシェーダです。

UINT uiPasses = 0; 
     res= g_lpEffect->Begin(&uiPasses, 0); 
     for (UINT uiPass = 0; uiPass < uiPasses; uiPass++) 
     { 
      res = g_lpEffect->BeginPass(uiPass); 
      res = sprite->Begin(D3DXSPRITE_SORT_TEXTURE); 
      res = sprite->Draw(tex, NULL, 0x0, 0x0, 0xFFFFFFFF); 
      res = sprite->End(); 
      res = g_lpEffect->EndPass(); 
     } 
     res = g_lpEffect->End(); 

そして、そういうシェーダを使ってテクスチャを描いています。私はこれが正しい方法であるとは確信していませんが、その件についてはほとんどリソースが見つかりませんでした。

シェーダは正しく作成されており、テクスチャも同様にすべての呼び出しがS_OKの戻り値を返しますが、コードを実行すると、テクスチャは赤で上書きされることなく完全に表示されます。

答えて

1

デフォルトでスプライトとエフェクトの両方が初期パイプライン状態を格納し、Beginが呼び出されたときに独自に設定してから、Endを呼び出すと復元します。したがって、sprite->Begin(D3DXSPRITE_SORT_TEXTURE);はエフェクト処理を無効にし、ピクセルシェーダーは決して呼び出されないと思われます。 D3DXSPRITE_DONOTMODIFY_RENDERSTATEのようなものをBeginに渡して、パイプラインの状態を変更しないようにすることもできますが、スプライトのレンダリングが損なわれる可能性があります。最近、固定パイプラインのレンダリングはほとんど廃止されているので、スプライトを完全に取り除き、独自のスプライトシェーダ(頂点とピクセルの両方)を作成する方がよいでしょう。

+0

私がやりたいことをするために自分のスプライトシェイダーを作成しました。 –

関連する問題