マウスポイントでピクセルの色を読み取る方法を探しています。OpenGL では、シーン (またはその一部) を描画した後に "glReadPixels" 関数を呼び出すことによって行われました。3D 空間で形状/線を識別するために、バックグラウンドで単純な色選択ルーチンを作成したいと考えています。
では、SharpDX (DirectX10 / DirectX11) で同じことを行うための同等の方法/機能/提案はありますか?
これは、Direct3D11 では完全に可能です。次の手順に従ってください。
このトピックについては、ネット上で多くの議論があります (たとえば、「DX11 でテクスチャから CPU に 1 ピクセルを読み取る」)。
別のオプションは、次のような小さな計算シェーダーを使用することです。
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;
}
もう少し「フォーマットにとらわれない」という利点があります。
プロセスはそのようなものです。
簡単にするために、計算シェーダーでのスレッド グループの最適化/チェックを省略したことに注意してください。
C# を使用しているため、DX には "glReadPixels" のような関数がないため、GDI+ を使用することをお勧めします。GDI+ は、マウス ポインターのピクセルの色を読み取る非常に簡単な方法を提供します。stackoverflow.com/questions/1483928を参照してください。
GDI+ があまり高速ではないのでダメなら、「Ray」を使った通常のオブジェクト ピッキングに固執できませんか? あなたは(私は3次元だと思う)形状/線を識別したいのですが、これは光線を使って(そして交差をチェックして)それらを選ぶのは簡単です。