Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda sobre carga de textura en Directx 9

Iniciado por notoi, 07 de Enero de 2011, 08:15:00 PM

« anterior - próximo »

notoi

Hola! Estoy haciendome un engine 2d bajo directx 9.  Tras mirar varios tutoriales consegui inicializarlo, cargar un grafico e imprimirlo. La cuestión es que me salia enorme en relación a la resolución de pantalla. Es decir que si pongo el modo de video en 1280x800 y cargo un grafico , pues me aparecia ocupando una zona bastante grande. Tras varios quebraderos encontre otra manera de hacerlo y me funcionó con una función similar pero con más parámetros.
     
     Ahora bien, yo quisiera saber porque si cargo la textura con D3DXCreateTextureFromFile me aparece enorme, y en cambio si lo hago con
D3DXCreateTextureFromFileEx me aparece perfecto. Me gustaría saber pq sale mal con el primero. Me gustaría utilizarlo ya que requiere menos parámetros. APs, la textura la imprimo creando un sprite D3DXCreateSprite y etc etc.  Gracias.

XÑA

Pues creo que createTexture catrga la textura tal como es, y la versión extendida te permite especificar parámetros de reescalado y filtros.

No tiene nada que ver cómo cargas la textura de cómo la muestras. Tu problema es otro, seguramente estás pintando el sprite con el mismo tamaño que la textura, y quizás eso no es lo que necesites.

notoi

Mmm no entiendo mucho. La verdad es que un bitmap de 206x49 pixels que cargo , en el mismo modo de video de 1280x800 con D3DXCreateTextureFromFileEx aparece en pantalla bien en relación con la resolución de la pantalla, en cambio en el mismo modo de video de 1280x800 con D3DXCreateTextureFromFile me aparece más grande de lo que debería ser. En cuanto pueda pongo ejemplo gráfico.

notoi

Bueno al final parece ser que la función guarda la textura internamente el doble de tamaño o algo asi(mi ingles no es muy bueno). O en potencia de 2. Sea como sea la versión extendida ya funciona bien, y cn la corta habria que reescalarlo añadiendo mas instrucciones. Asi que me quedo cn la versión extendida. Esto lo encontre en este link:

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/660b4509-8bca-44a8-a829-9d2d9d48b2dd/

Para quien pueda interesar. Un saludo.

[EX3]

#4
Ten cuidado por que creo que no todas las tarjetas gráficas soportan texturas no potencia de dos (D3DX_DEFAULT_NONPOW2) , quizás esto te de problemas en algunos equipos sobre todo en equipos antiguos, no muy recientes y/o placas integradas basicas (muchas de los portatiles).

Lo que tienes que hacer no es guardar la textura con el tamaño que necesitas mostrar en pantalla si no calcular su escala a la hora de dibujarla.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

notoi

Bueno yo lo cargo poniendo la resolución directamente. Asi:

D3DXIMAGE_INFO d3dxImageInfo;

    hr = D3DXCreateTextureFromFileEx( p_device,
                                 "a.bmp",
                                 800, // I had to set width manually. D3DPOOL_DEFAULT works for textures but causes problems for D3DXSPRITE.
                                 600, // I had to set height manually. D3DPOOL_DEFAULT works for textures but causes problems for D3DXSPRITE.
                                 1,   // Don't create mip-maps when you plan on using D3DXSPRITE. It throws off the pixel math for sprite animation.
                                 D3DPOOL_DEFAULT,
                                 D3DFMT_UNKNOWN,
                                 D3DPOOL_DEFAULT,
                                 D3DX_DEFAULT,
                                 D3DX_DEFAULT,
                                 D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f),
                                 &d3dxImageInfo,
                                 NULL,
                                 &imagetex);


Ahora bien, irá bien asi la cosa? o causará problemas tb?  Al final me volvere a directx 7 era mas facil xD

XÑA

El problema aquí es que da igual lo que tu hagas, la tarjeta hará lo que pueda  ;)
Por tanto, si no soporta texturas con potencias que no sean de 2, simplemente te lo escalará. Así que te funcionará en unos y no en otros, debido a la tarjeta.  8o

Lo que tienes que hacer, es trabajar con potencias de 2, y así NO tendrás problemas. Recuerda que no tiene nada que ver el tamaño del sprite con el tamaño de la textura, tienes que tener muy claro eso.

[EX3]

notoi, tu código dará como resultado una textura de 1024x1024 (800->1024, 600->1024, siempre se escala hacia arriba). Piensa que las tarjetas gráficas funcionan de esta manera a la hora trabajar con las texturas, por eso te decía que da igual como se guarde la textura, simplemente cárgala con su tamaño natural, para ello, utiliza la constante D3DX_DEFAULT en los parámetros Width y Height de D3DXCreateTextureFromFileEx(), así no tienes que calcular que tamaño tiene que tener la textura en memoria, lo calcula Direct3D por ti. Luego solo tendrás que calcular tu la escala correcta a la hora de dibujar la textura.

Por cierto, un problema de trabajar con texturas que no son potencia de 2 es que luego al tratar de dibujarlas a su tamaño original quizás notes suavizados por el escalado.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

notoi

#8
Hola, me estoy liando un poco pero bueno. He probado a meterle D3DX_DEFAULT en la función y al ver la imagen en modo de video de 800x600 pues salia enorme. Con photoshop reducí el bitmap a 400x300 para ver como se ve cn el mismo parámetro D3DX_DEFAULT. Y se veia mas pequeño pero en formato cuadrado. De lo que entiendo como decis, creo, que cuando cargué el bitmap de 800x600 pues se guardo como una imagen de 1024x1024. Y cuando lo cargue como 400x300 supongo que seria una imagen de 512x512(de ahi que lo viera pequeña y cabia en pantalla pero en formato cuadrado).   Bueno el bitmap que es solamente un fondo de pantalla lo dibujaba cn la funciones de sprite:

sprite->Begin();
sprite->Draw(imagetex,NULL,NULL,NULL,0,(D3DXVECTOR2 *)&imagepos,0xFFFFFFFF);
sprite->End();

  Asi pues, yo quiero dibujar sprites 2d. Cargar la imagen e imprimirla y que se vea bien.  SI cargos los bitmaps(ya sea un fondo entero o un bitmap con animaciones) con el parametro D3DX_DEFAULT, luego tendria que escalarlos antes de dibujarlos. No es mejor ya en el mismo momento de cargarlo poner el tamaño del bitmap como lo tenia yo(800x600)  ? Y asi me olvido luego de tener que escalarlos?? Y si quisiera usar potencia de 2 para el fondo de 800x600 igual tendria que dividirlo en bloques: por ejemplo el ancho de 800 a un bloque de 512, el siguiente de 256 y el siguiente a 32. MM mucho lio xD. Era solo un ejemplo.


MMm se me olvidaba una cosa. QUe pasa si el bitmap es más grande de lo que la targeta de video pueda cargar. Por ejemplo que halla alguna targeta de video que solo permita cargar una textura de resolucion maxima de 512x512 y yo intento cargar mi bitmap de 800x600. Me dará error? o automaticamente lo cargará exitosamente? Quizas deba hacer una comprobación del tamaño máximo que puede cargar y si no corresponde cn lo máximo que yo quiero dar un mensaje de error y que necesita una targeta de video superior?? Saludos.

[EX3]

#9
Cita de: notoi en 14 de Enero de 2011, 03:10:41 PM
MMm se me olvidaba una cosa. QUe pasa si el bitmap es más grande de lo que la targeta de video pueda cargar. Por ejemplo que halla alguna targeta de video que solo permita cargar una textura de resolucion maxima de 512x512 y yo intento cargar mi bitmap de 800x600. Me dará error? o automaticamente lo cargará exitosamente?
Te lo cargara al tamaño maximo de la tarjeta grafica. Esto no deberia preocuparte ya que el maximo de de tamaño de hace 7 años por norma eran de 2048x2048 a 4096x4096 y dudo que vayas a usar texturas tan grandes :) (es mas, no lo recomiendo)

Cita de: notoi en 14 de Enero de 2011, 03:10:41 PM
Asi pues, yo quiero dibujar sprites 2d. Cargar la imagen e imprimirla y que se vea bien.  SI cargos los bitmaps(ya sea un fondo entero o un bitmap con animaciones) con el parametro D3DX_DEFAULT, luego tendria que escalarlos antes de dibujarlos. No es mejor ya en el mismo momento de cargarlo poner el tamaño del bitmap como lo tenia yo(800x600)  ? Y asi me olvido luego de tener que escalarlos??
Y si tienes que dibujar el sprite a la mitad de tamaño o al doble o al tamaño que necesites, o aplicarle un tamaño raro por la razon que sea, que haces pues? cargas la textura en memoria con cada tamaño que necesitas? Obviamente no :P Las cosas no funcionan asi. Tu cargas la textura a su tamaño en potencia 2 en la memoria de tarjeta y despues le aplicas el escalado que necesites para mostrarla. Hay que entender que no tiene nada que ver el tamaño real de una textura con sus propiedades a la hora de presentarlo en pantalla.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

notoi

#10
Mm no creo que vaya a imprimir el sprite mas grande o mas pequeño. Solo queria asegurarme que si los cargaba directamente indicando su resolución no tendria problemas en que no sale bien en segun que targetas gráficas. No obstante supongo que será bueno que lo cargue de forma génerica en potencia de 2, y que escriba la posibilidad de escalado en las funciones para poder reutilizar código en futuros proyectos.  Bueno gracias por todo.Mirare eso del escalado.  ^_^'









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.