Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: AgeR en 17 de Junio de 2004, 01:34:52 PM

Título: Texturas En Dx9
Publicado por: AgeR en 17 de Junio de 2004, 01:34:52 PM
 Vamos a ver si me explico bien XD

Tengo una imagen en una matriz en memoria, y quiero convertirla a una textura DX9. Hay alguna forma simple de hacerlo? Rollo alguna función de las D3DX que se me haya pasado o algo así.

La forma natural es rellenarla a "modo vertex buffer" no? Es decir, lockeamos la textura, escribimos los datos, y unlockeamos. Es esto correcto o me equivoco? La verdad es que nunca he hecho otra cosa que cargar texturas de disco...  :rolleyes:

Venga gracias!
Título: Texturas En Dx9
Publicado por: fiero en 17 de Junio de 2004, 02:14:00 PM
 Yo para pasar mis texturas en memoria a textura DX hago esto, aunque no sé si está del todo bien:


IDirect3DTexture9* m_pTexture;

hRes=m_pd3dDevice->CreateTexture(tx,ty,1,0,D3DFMT_R8G8B8,D3DPOOL_MANAGED,&m_pTexture,NULL);
if(hRes==DD_OK)
{
 hRes=m_pTexture->LockRect(0,&lock,NULL,0);
 if(hRes==DD_OK)
 {
  memcpy(lock.pBits,bufferTextura,tx*ty*3);

  hRes=m_pTexture->UnlockRect(0);
 }
}


un saludo
Título: Texturas En Dx9
Publicado por: HgH en 17 de Junio de 2004, 02:24:55 PM
 
Cita de: "fiero"
IDirect3DTexture9* m_pTexture;

hRes=m_pd3dDevice->CreateTexture(tx,ty,1,0,D3DFMT_R8G8B8,D3DPOOL_MANAGED,&m_pTexture,NULL);
if(hRes==DD_OK)
{
 hRes=m_pTexture->LockRect(0,&lock,NULL,0);
 if(hRes==DD_OK)
 {
  memcpy(lock.pBits,bufferTextura,tx*ty*3);

  hRes=m_pTexture->UnlockRect(0);
 }
}

Hay que tener cuidado con el pitch (el otro elemento de la estructura D3DLOCKED_RECT).
La mayoría de las veces coincidiría con (tx*bpp)  pero no siempre tiene por que coincidir.
Si no coincidiera, estarías machacando cosas que no debes y dejarías un cacho de textura sin escribir
Pégale un vistazo a la MSDN
Título: Texturas En Dx9
Publicado por: AgeR en 17 de Junio de 2004, 03:31:55 PM
 Ok, muchas gracias por vuestra ayuda!  :lol:  
Título: Texturas En Dx9
Publicado por: fiero en 17 de Junio de 2004, 04:12:21 PM
 Sí, el código es muy simple, y da por sentado que las texturas tienen un tamaño potencia de 2. Si el tamaño es potencia de 2, el pitch siempre coincide con tx*(bpp/8), y se puede usar un solo memcpy, que es más rápido

un saludo
Título: Texturas En Dx9
Publicado por: AgeR en 19 de Junio de 2004, 08:08:51 PM
 Pues me he puesto con ello y hmmmm... tengo una imagen de prueba en memoria de 128x128xRGB.
El caso es que la textura se crea bien, pero al comprobar el Pitch, me dice que vale 512. En todo caso debería valer 128*3 no?
La textura está creada con D3DXCreateTexture con el formato D3DFMT_R8G8B8. Puede ser que de todos modos se guarde el espacio para el canal alfa? Es la unica explicacion que se me ocurre, ya que 128x4 sí que son los 512 que me dá el pitch.

Alguien sabe cual puede ser el motivo?  :(  
Título: Texturas En Dx9
Publicado por: Zaelsius en 19 de Junio de 2004, 10:12:39 PM
 Supongo que aunque no uses canal alfa, se utilizan 32 bits por pixel por aquello de la alineación de datos  :rolleyes: . Moraleja: Consulta siempre el pitch devuelto por DX.
Título: Texturas En Dx9
Publicado por: AgeR en 19 de Junio de 2004, 10:44:46 PM
 Parece que sí que va a ser eso, he probado a convertir la matriz y meter el valor del alfa y ha funcionado. Pues nada, otra cosa más que se aprende, habrá que tener muy en cuenta el pitch dichoso.
Muchas gracias!  :lol: