c# opengl directx sharpdx

c# - Una función como "glReadPixels" en DirectX/SharpDX



opengl (3)

Esto es perfectamente posible con Direct3D11: simplemente siga estos pasos:

  • Use DeviceContext.CopySubResourceRegion para copiar parte de la textura de origen a una textura de transición (tamaño del área de píxeles que desea volver a leer, el mismo formato, pero con ResourceUsage.Staging)
  • Recupere el píxel de esta textura de estadificación utilizando Device.Map/UnMap.

Hay mucha discusión sobre este tema en la red (por ejemplo: " Leer un píxel de la textura a la CPU en DX11 ")

Estoy buscando una manera de leer un color de píxeles en el punto del mouse. En OpenGL se hizo llamando a la función "glReadPixels" después de dibujar la escena (o partes de ella). Quiero hacer una rutina de selección de color simple en el fondo, para identificar formas / líneas en el espacio 3D.

Entonces, ¿hay algún método / función / sugerencia equivalente para hacer lo mismo en SharpDX (DirectX10 / DirectX11)?


Otra opción es usar un pequeño sombreador de cómputo, como:

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; }

Te da la ventaja de ser un poco más "agnóstico al formato".

El proceso es así.

  • Cree un pequeño búfer estructurado para UV (float2) (posición de píxel / tamaño de la textura, no se olvide de voltear el eje Y, por supuesto). Copie la posición de píxeles que desea muestrear en este búfer.
  • Cree un búfer grabable y un búfer de transición (float4). Necesita ser el mismo elemento contar como tu buffer uv.
  • Enlazar todo y enviar
  • Copie el buffer escribible en el escenario.
  • Asignación y lectura de datos de float4 en la CPU

Tenga en cuenta que omití la optimización / verificación del grupo de subprocesos en el sombreador de cómputo para simplificar.


Como está usando C #, mi sugerencia sería usar GDI +, ya que no existe una función como "glReadPixels" en DX. GDI + ofrece métodos muy sencillos para leer el color de un píxel en el puntero del mouse. Consulte .com/questions/1483928 .

Si GDI + es un no ir, ya que no es muy rápido, ¿no puedes apegarte a la selección habitual de objetos usando un "Rayo"? Si desea identificar (supongo que tridimensionales) formas / líneas, sería fácil usar un rayo (y verificar la intersección) para elegirlas.