0

各フレームをキャプチャし、ルックアップテーブルに従って各ピクセルの位置を変更したいと思います。たとえば、ピクセル(30,35)->(40,50)などです。

したがって、私が行ったことは、RenderTarget2Dによってフレームをキャプチャし、各ピクセルを通過して、新しいビットマップ配列に各ピクセルの新しい位置を設定することです。ただし、これにより、RenderTarget2D.GetColorメソッドの影響により、パフォーマンスが低下しました。

だから私はピクセルシェーダーが解決策かもしれないと思った:Drawメソッドで:1。単純なフレームを描く2.RenderTarget2Dでそれをキャプチャする3.そしてシェーダーを通してモデルを描く

しかし、シェーダー内では、キャプチャされたばかりのTexture2Dと、マップされたピクセル位置を読み取るためのルックアップテーブルにアクセスする必要があります。これらの変数をシェーダーに渡すにはどうすればよいですか?

編集:これはDraw()メソッドにあるコードですが、モデルに変更が適用されない理由がわかりません

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Textures[0] = ShaderRenderTarget;
        GraphicsDevice.Textures[1] = LookupTexture;

        // Change to our offscreen render target. 
        GraphicsDevice.SetRenderTarget(ShaderRenderTarget); 
        // Render a simple scene.
        DrawAFrame(); 

        // Change back to the back buffer, and get our scene
        // as a texture. 
        GraphicsDevice.SetRenderTarget(null);

        waldramEffect.CurrentTechnique = waldramEffect.Techniques["Waldraam"];
        // Use Immediate mode and our effect to draw the scene
        // again, using our pixel shader. 
        GraphicsDevice.Clear(Color.CornflowerBlue);
        CreateViewMatrix();

        // Copy any parent transforms.
        Matrix[] transforms = new Matrix[myModel.Bones.Count];
        myModel.CopyAbsoluteBoneTransformsTo(transforms);

        // Draw the model. A model can have multiple meshes, so loop.
        foreach (ModelMesh mesh in myModel.Meshes)
        {
            // This is where the mesh orientation is set, as well 
            // as our camera and projection. 
            foreach (ModelMeshPart part in mesh.MeshParts)
            {
                part.Effect = waldramEffect;
                waldramEffect.Parameters["World"].SetValue(Matrix.CreateRotationY(modelRotation) * Matrix.CreateTranslation(modelPosition));
                waldramEffect.Parameters["View"].SetValue(lookAt);
                waldramEffect.Parameters["Projection"].SetValue(projection); 
            }
            // Draw the mesh, using the effects set above.
            mesh.Draw();
        } 
        base.Draw(gameTime);

        int i = 0;
        foreach (ModelMesh mesh in myModel.Meshes)
        {
            foreach (ModelMeshPart part in mesh.MeshParts)
            {
                part.Effect = basicEffects[i];
                i++;
            }
        }
    }
4

1 に答える 1

1

X オフセットと Y オフセットを 2 つのテクスチャ チャネル (例: 赤と緑) に格納して、ルックアップ テーブルをテクスチャにします。

グラフィックス デバイスで両方のテクスチャ (XNA のレンダー ターゲットはテクスチャ) を次のように設定します。

GraphicsDevice.Textures[0] = myRenderTarget;
GraphicsDevice.Textures[1] = myLookupTable;

(それを使用している場合は、内部でSpriteBatch設定されることに注意してください。)Texture[0]

シェーダーで、それぞれのサンプラーを宣言します。

sampler myRenderTarget: register(s0);
sampler myLookupTable: register(s1);

次に、ルックアップ テーブルをサンプリングして、レンダー ターゲット内のサンプリングされた位置を調整します。

tex2D(myRenderTarget, inTexCoord.xy + tex2D(myLookupTable, inTexCoord.xy).xy);

上記の HLSL コードをテストしていないことに注意してください。また、オフセットをピクセル座標で機能させ、負のオフセットを許可する場合は、追加の数学を提供する必要があります。

于 2012-09-07T16:06:17.203 に答える