2011-01-23 7 views
1

CenderでManaged Direct X 2.0を使用していますが、RenderToSurfaceヘルパクラスを使用してスクリーンをテクスチャにレンダリングして作成したテクスチャにフラグメントシェーダを適用しようとしています。マネージドDirectX後処理フラグメントシェーダレンダリングの問題

私はこれを行うために使用しているコードは次のとおりです。

私の表面にレンダリングする
RtsHelper.BeginScene(RenderSurface); 
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1.0f, 0); 
//pre-render shader setup 
preProc.Begin(FX.None); 
    preProc.BeginPass(0); 
     //mesh drawing 
     mesh.DrawSubset(j); 
     preProc.CommitChanges(); 
    preProc.EndPass(); 
preProc.End(); 
RtsHelper.EndScene(Filter.None); 

、RenderTexture

と呼ばれるテクスチャオブジェクトに添付されRenderSurfaceは、それから私は、次のコードを呼び出します描画されたテクスチャに第2のシェーダ「PostProc」を適用して、サーフェスをスクリーンにレンダリングします。このシェーダは、ピクセル単位でカラー値を結合し、シーンをグレースケールに変換します。私はここでチュートリアルを次のようだ:http://rbwhitaker.wikidot.com/post-processing-effects

device.BeginScene(); 
{ 
    using (Sprite sprite = new Sprite(device)) 
    { 
     sprite.Begin(SpriteFlags.DoNotSaveState); 
      postProc.Begin(FX.None); 
       postProc.BeginPass(0); 
        sprite.Draw(RenderTexture, new Rectangle(0, 0, WINDOWWIDTH, WINDOWHEIGHT), new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.White); 
        postProc.CommitChanges(); 
       postProc.EndPass(); 
      postProc.End(); 
     sprite.End(); 
    } 

} 
device.EndScene(); 
device.Present(); 
this.Invalidate(); 

しかし、私が見るすべてはテクスチャにレンダリングされたとして、元レンダリングされたシーンであるが、2番目のシェーダによって変更されていません。

重要な場合は、FXファイルは以下のとおりです。

//------------------------------ TEXTURE PROPERTIES ---------------------------- 
// This is the texture that Sprite will try to set before drawing 
texture ScreenTexture; 

// Our sampler for the texture, which is just going to be pretty simple 
sampler TextureSampler = sampler_state 
    { 
     Texture = <ScreenTexture>; 
    }; 

//------------------------ PIXEL SHADER ---------------------------------------- 
// This pixel shader will simply look up the color of the texture at the 
// requested point, and turns it into a shade of gray 
float4 PixelShaderFunction(float2 TextureCoordinate : TEXCOORD0) : COLOR0 
{ 
    float4 color = tex2D(TextureSampler, TextureCoordinate); 

    float value = (color.r + color.g + color.b)/3; 
    color.r = value; 
    color.g = value; 
    color.b = value; 

    return color; 
} 

//-------------------------- TECHNIQUES ---------------------------------------- 
// This technique is pretty simple - only one pass, and only a pixel shader 
technique BlackAndWhite 
{ 
    pass Pass1 
    { 
     PixelShader = compile ps_1_1 PixelShaderFunction(); 
    } 
} 

答えて

0

固定されています。ポストプロセッサシェーダの初期化

ために間違ったフラグを使用していたことだった。

sprite.Begin(SpriteFlags.DoNotSaveState); 
    postProc.Begin(FX.None); 

は次のようになります。

sprite.Begin(SpriteFlags.DoNotSaveState); 
    postProc.Begin(FX.DoNotSaveState);