Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Texturas En Dx9

Iniciado por AgeR, 17 de Junio de 2004, 01:34:52 PM

« anterior - próximo »

AgeR

 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!

fiero

 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
www.videopanoramas.com Videopanoramas 3D player

HgH

 
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
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

AgeR

 Ok, muchas gracias por vuestra ayuda!  :lol:  

fiero

 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
www.videopanoramas.com Videopanoramas 3D player

AgeR

 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?  :(  

Zaelsius

 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.

AgeR

 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:  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.