それは2つのテクスチャ間の「違い」を見つけるために、シェーダを使用することは可能ですか? (XNA / HLSL)
質問
私は現在のフレームの画素が前フレームに有意に異なる場合を示し、テクスチャを描画する「動きのエッジを」検知する単純なウェブカメラベースのアプリケーションを作りました。これは私のコードです:
// LastTexture is a Texture2D of the previous frame.
// CurrentTexture is a Texture2D of the current frame.
// DifferenceTexture is another Texture2D.
// Variance is an int, default 100;
Color[] differenceData = new Color[CurrentTexture.Width * CurrentTexture.Height];
Color[] currentData = new Color[CurrentTexture.Width * CurrentTexture.Height];
Color[] lastData = new Color[LastTexture.Width * LastTexture.Height];
CurrentTexture.GetData<Color>(currentData);
LastTexture.GetData<Color>(lastData);
for (int i = 0; i < currentData.Length; i++)
{
int sumCD = ColorSum(currentData[i]); // ColorSum is the same as c.R + c.B + c.G where c is a Color.
int sumLD = ColorSum(lastData[i]);
if ((sumCD > sumLD - Variance) && (sumCD < sumLD + Variance))
differenceData[i] = new Color(0, 0, 0, 0); // If the current pixel is within the range of +/- the Variance (default: 100) variable, it has not significantly changes so is drawn black.
else
differenceData[i] = new Color(0, (byte)Math.Abs(sumCD - sumLD), 0); // This has changed significantly so is drawn a shade of green.
}
DifferenceTexture = new Texture2D(game1.GraphicsDevice, CurrentTexture.Width, CurrentTexture.Height);
DifferenceTexture.SetData<Color>(differenceData);
LastTexture = new Texture2D(game1.GraphicsDevice,CurrentTexture.Width, CurrentTexture.Height);
LastTexture.SetData<Color>(currentData);
シェーダを使用してGPUにこの計算をオフロードする方法はあります(これは、上記の方法を使用しておよそ25/26 fpsで行くことができるが、これは少し遅いですか)?私は、HLSLシェーダがどのように働くかの基本的な理解を持っており、完全なソリューションを期待していない、私はこれが可能であるかどうかを知りたいとどのようにシェーダから「違い」テクスチャデータを取得するために、これは実際に速くなるならばます。
事前に感謝します。
解決
、あなたの問題へのデュアルスレッドのアプローチを使用するMicrosoftからの.Netパラレル拡張CTPをチェックアウトすることを決定に関する上記のコメントについて。 microsoft.comする
あなたはXBox360上に展開することを計画していない場合は、このライブラリは、XNAとの素晴らしい作品、と私は特定のループや反復回数の大幅な速度の向上を見てきました。
あなたは基本的にのみ、たとえば、数行のコードを変更する必要があります:
for (int i = 0; i < currentData.Length; i++)
{
// ...
}
に変更します。
Parallel.For(0, currentData.Length, delegate(int i)
{
// ...
});
自動的にプロセッサの各コアは数がバリバリを手伝うようにします。これは、高速かつ優れたのです。
グッドラック!
他のヒント
その後、ピクセルシェーダ内側2つのテクスチャをサンプリング色値との差を書くことができます。あなたがターゲットをレンダリングnoreferrer">
ソーベル演算子のか、ゲームエンジンや他のリアルタイムアプリケーションで使用されているようなものエッジ検出のため。ピクセルシェーダとして書くことが自明である。