各フレームをキャプチャし、ルックアップテーブルに従って各ピクセルの位置を変更したいと思います。たとえば、ピクセル(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++;
}
}
}