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.