2011-03-19 13 views
6

Leo en otro hilo, que puedo leer un solo píxel con Texture.Lock/Unlock, pero necesito volver a escribir los píxeles en la textura después de leerlos, este es mi código hasta ahoraDirectX establece el color de un solo píxel

unsigned int readPixel(LPDIRECT3DTEXTURE9 pTexture, UINT x, UINT y) 
{ 
    D3DLOCKED_RECT rect; 
    ZeroMemory(&rect, sizeof(D3DLOCKED_RECT)); 
    pTexture->LockRect(0, &rect, NULL, D3DLOCK_READONLY); 
    unsigned char *bits = (unsigned char *)rect.pBits; 
    unsigned int pixel = (unsigned int)&bits[rect.Pitch * y + 4 * x]; 
    pTexture->UnlockRect(0); 
    return pixel; 
} 

Así que mis preguntas son:

- How to write the pixels back to the texture? 
- How to get the ARGB values from this unsigned int? 

((BYTE) x >> 8/16/24) no funcionó para mí (el valor devuelto por la función era 688)

+0

por curiosidad, ¿por qué necesitas hacer esto? – tbridge

+0

debe saber que el rendimiento de este tipo de bloqueo es solo el nivel de cucarachas. (En 2002, según mis pruebas, estaba funcionando a 0.5 FPS, hoy puede ser más rápido, pero aún te estás incapacitando para hacer este tipo de cosas). –

Respuesta

5

1) Una forma es usar un memcpy:

memcpy(&bits[rect.Pitch * y + 4 * x]), &pixel, 4); 

2) Hay varias maneras diferentes. El más simple es definir una estructura de la siguiente manera:

struct ARGB 
{ 
    char b; 
    char g; 
    char r; 
    char a; 
}; 

a continuación, cambiar su código de carga de píxeles a lo siguiente:

ARGB pixel; 
memcpy(&pixel, &bits[rect.Pitch * y + 4 * x]), 4); 

char red = pixel.r; 

También se puede obtener todos los valores usando máscaras y turnos. por ejemplo,

unsigned char a = (intPixel >> 24); 
unsigned char r = (intPixel >> 16) & 0xff; 
unsigned char g = (intPixel >> 8) & 0xff; 
unsigned char b = (intPixel)  & 0xff; 
Cuestiones relacionadas