Un'altra opzione è quella di utilizzare una piccola shader di calcolo, come:
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;
}
Dà hai il vantaggio di essere un po 'più "formato agnostico".
Il processo è quindi così.
- Creare un buffer strutturato piccolo per UV (float2) (posizione pixel/dimensione della trama, non dimenticare di capovolgere l'asse Y, naturalmente). Copia la posizione dei pixel che vuoi campionare in questo buffer.
- Creare un buffer scrivibile e un buffer di staging (float4). Deve essere lo stesso conteggio degli elementi del tuo buffer uv.
- Lega tutto e Invio
- Copia buffer scrivibile in staging.
- Mappa e leggere i dati in float4 cpu
Si prega di notare ho omesso gruppo di thread di ottimizzazione/controlli a Compute Shader per semplicità.
È possibile qualcosa del genere in DX9? – jjxtra