6

マウスポイントでピクセルの色を読み取る方法を探しています。OpenGL では、シーン (またはその一部) を描画した後に "glReadPixels" 関数を呼び出すことによって行われました。3D 空間で形状/線を識別するために、バックグラウンドで単純な色選択ルーチンを作成したいと考えています。

では、SharpDX (DirectX10 / DirectX11) で同じことを行うための同等の方法/機能/提案はありますか?

4

3 に答える 3

8

これは、Direct3D11 では完全に可能です。次の手順に従ってください。

  • DeviceContext.CopySubResourceRegionを使用して、ソース テクスチャの一部をステージング テクスチャにコピーします (リードバックするピクセル領域のサイズ、同じ形式ですが、ResourceUsage.Staging を使用します)。
  • Device.Map/UnMap を使用して、このステージング テクスチャからピクセルを取得します。

このトピックについては、ネット上で多くの議論があります (たとえば、「DX11 でテクスチャから CPU に 1 ピクセルを読み取る」)。

于 2012-11-12T15:06:44.720 に答える
2

別のオプションは、次のような小さな計算シェーダーを使用することです。

Texture2D<float4> TextureInput: register(t0);
StructuredBuffer<float2> UVBuffer: register(t1);
RWStructuredBuffer<float4> RWColorBuffer : register(u0);

SamplerState Sampler : register( s0 );

[numthreads(1, 1, 1)]
void CSGetPixels( uint3 DTid : SV_DispatchThreadID )
{ 
float4 c = TextureInput.SampleLevel(Sampler , UVBuffer[DTid.x].xy, 0);
RWColorBuffer [DTid.x] = c;
}

もう少し「フォーマットにとらわれない」という利点があります。

プロセスはそのようなものです。

  • UV (float2) 用の小さな構造化バッファを作成します (ピクセル位置/テクスチャ サイズ、もちろん Y 軸を反転することを忘れないでください)。サンプリングしたいピクセル位置をこのバッファにコピーします。
  • 書き込み可能バッファーとステージング バッファー (float4) を作成します。UV バッファと同じ要素数である必要があります。
  • すべてバインドして発送
  • 書き込み可能なバッファをステージング バッファにコピーします。
  • CPU での float4 データのマッピングと読み取り

簡単にするために、計算シェーダーでのスレッド グループの最適化/チェックを省略したことに注意してください。

于 2012-11-13T06:42:18.170 に答える
1

C# を使用しているため、DX には "glReadPixels" のような関数がないため、GDI+ を使用することをお勧めします。GDI+ は、マウス ポインターのピクセルの色を読み取る非常に簡単な方法を提供します。stackoverflow.com/questions/1483928を参照してください。

GDI+ があまり高速ではないのでダメなら、「Ray」を使った通常のオブジェクト ピッキングに固執できませんか? あなたは(私は3次元だと思う)形状/線を識別したいのですが、これは光線を使って(そして交差をチェックして)それらを選ぶのは簡単です。

于 2012-11-12T12:36:38.510 に答える