Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





2D en DX9

Iniciado por Sergio, 16 de Febrero de 2003, 02:47:26 PM

« anterior - próximo »

Sergio

                                hola
estoy haciendo unas pruebas de 2D en dx9, y bueno, no hago mas que leer que hay que usar poligonos a partir de la version 8.0, etc. entonces estoy intentando usar vertices transformados y con textura, pero no los puedo mover usando matrices, como lo hago??
es que kiero aprovechar la tarjeta 3d para las 2d tb, pero controlando las 2d con las coordenadas de pantalla, por lo q no me vale la proyeccion ortografica, si hay otra forma mas "limpia" de hacerlo en dx9, os agradeceria q me dijerais cual, siempre usando la tarjeta 3D, claro.
gracias de antemano y un saludo!!!                                
here are only 10 types of people: those who understand binary and those who don't

[Over]

                                Hola.

Sino te quieres complicar mucho la vida (sacando un buen resultado), usa la interfaz IDXSPRITE. Miratelo en la ayuda, no te hará falta usar la camara ni nada y puedes usar las coordenadas de pantalla sin problemas.                                

Sergio

                                pero esos sprites son acelerados por hardware?? es decir, en realidad son poligonos?

gracias por tu ayuda

un saludo!!                                
here are only 10 types of people: those who understand binary and those who don't

[Over]

                                Hola.

Si, tiene aceleración por hardware y demas historias. Y si, son realmente poligonos, solo que te ahorra el tener que crearlos tu, aplicar la textura y dibujarlos (y controlar la camara). Estos poligonos (sprites) dibujados, iran independiente de la camara, por mucho que la muevas, estos no se moveran (a menos que tu se lo indiques mediante el interfaz).
Mirate la ayuda, es muy sencilla.                                

Sergio

                                muchiiiiiiiiiiiiiiisimas gracias, era justo lo q necesitaba leer :D

gracias de nuevo y un saludo!                                
here are only 10 types of people: those who understand binary and those who don't

Sergio

                                bueno, ya me he construido una clase para manejar mis sprites. ahora estoy intentando pasar un menu para practicar, entonces cuando dibujo lo q es el sprite de fondo (800x600, teniendo una resolucion de 800x600) me sale demasiado grande. puedo solucionar esto sin escalar el sprite??

un saludo!!                                
here are only 10 types of people: those who understand binary and those who don't

[Over]

                                Hola.

No se cual es exactamente tu problema, o no lo has explicado bien o yo no lo he entendido como dios manda. Te diré que tengas en cuenta que al dibujar texturas, estan han de ser potencia de 2 (128x128,256x256,etc..), si tu has cargado una textura de 800x600 y te la dibuja bien, es porque tu tarjeta trabaja con texturas de 1024x1024, ten en cuenta esto porque mucha gente no tiene tarjetas que soporten eso y no es lo más optimo para la memoria. Si tu valor del scale tanto en x como en y es 1.0f, la textura no ha de dibujarse más grande de lo normal.
Una cosa si noté yo (al menos), si dibujas en modo ventana con los buffers (ancho y alto) declarados, ya no solo me bajaban los fps, sino que la imagen parecia dibujarse "mas grande", pruebalo, se nota algo. ¿Quizas es eso lo que tu dices?

En cuanto al tamaño de textura, yo recomiendo que te crees una clase (o algo asi), que te gestiona imagenes, si son mayores que un tamaño de textura expuesto por ti o el mayor permitido por la tarjeta (en ejecucion), pues que las partas (dividas) en varias texturas de ese tamaño elegido. Yo suelo trabajar con texturas de 256x256 (o menores), dando un resultado bastante optimo para todo.                                

Sergio

                                hola

CitarUna cosa si noté yo (al menos), si dibujas en modo ventana con los buffers (ancho y alto) declarados, ya no solo me bajaban los fps, sino que la imagen parecia dibujarse "mas grande", pruebalo, se nota algo. ¿Quizas es eso lo que tu dices?

si con lo de declarar los buffers te refieres a darles un valor de ancho y alto en la estructura D3DPRESENT_PARAMETERS, si, lo he hecho, sino, explicame (si no te importa) lo que he de hacer para probar a que se me dibuje mas pequeño. porque he conseguido ajustar el sprite (de 800x600, igual que la resolucion) a toda la pantalla ajustando la escala, pero me parece un metodo un poco chapucero y creo q debe haber otra forma. He probado a hacer el bitmap cuadrado en potencia de 2 y escalar para que en realidad me quede en 800x600, pero sigue apareciendo mas grande.

pues eso, muchas gracias por tu ayuda

un saludo!!!!!!!!!                                
here are only 10 types of people: those who understand binary and those who don't

Sergio

                                hola
bueno, investigando por ahi "he descubierto" que cuando cargas una textura que no es potencia de dos, automaticamente lo transforma a la potencia de 2 mas cercana. el texto en cuestion era este:

CitarQ. When I draw an image using ID3DXSprite::Draw() with 1:1 scaling, the sprite is different than the original image size.  Why?
Since the image file is loaded into a texture, the bitmap is scaled to match the capabilities of the hardware. In general, this means that images that have dimensions that are not powers of 2 will be scaled up to the nearest power of 2.

When loading an image with D3DXCreateTextureFromFileEx(), you can pass a pointer to a D3DXIMAGE_INFO structure, which will be filled with information about the source image. You can then get the size of the texture using IDirect3DTexture::GetLevelDesc() and calculate the required scaling factor for 1:1 rendering:

LPDIRECT3DTEXTURE8 pText;
D3DXIMAGE_INFO info;
D3DXCreateTextureFromFileEx(....,&info,....,&pText);
D3DSURFACE_DESC desc;
pText->GetLevelDesc(0,&desc);
D3DXVECTOR2 vScaling;
vScaling.x=info.Width/desc.Width;
vScaling.y=info.Height/desc.Height;

que lo disfruteis!!!  :P

saludos!!!                                
here are only 10 types of people: those who understand binary and those who don't

[Over]

                                Hola.

Creo que no me entendiste bien o puede que sea yo el que lo explicara mal.
Yo no uso el calculo del scale correcto por el siguiente motivo:
Yo cargo una surface que será el fichero (tamaño 800x600, supongamos), a continuación calculo el numero de texturas necesarias tanto para el alto como para el ancho (de la surface), teniendo en cuenta el tamaño de textura que yo expongo, que puede ser el maximo permitido por tu tarjeta o uno forzado por ti (yo lo fuerzo a 256x256 o menores segun el tamaño de la surface). Una vez que ya conozco cuantas texturas en total necesito, proceso a leer desde la surface y copiar en la textura creada, si la textura es de 256x256, leere 256 pixeles de ancho y 256 pixeles de alto de la surface y los copiaré en la textura y asi hasta haber copiado toda la surface en las diferentes texturas. Teniendo al final un array de texturas de 256x256 que contiene la misma surface (la imagen del fichero), pero en texturas potencia de 2 que puede manejar mi tarjeta.
Es posible que si tu cargas una textura de 800x600, la pase al tamaño mas cercano potencia de 2 y como tu tarjeta puede manejar hasta texturas de 1024x1024 (por lo que veo) no tienes problemas, salvo en el escalado, que lo hace incorrecto. Pero esa aplicación no podrá ser ejecutada en tarjetas que usen texturas menores.
Tal como yo lo dibujo, eligiendo 1:1 de escalado, lo hace perfectamente.

Chao.                                

Sergio

                                Hola.
Ahora entiendo lo que dices. No te habia pillado :P. Bueno, y una vez que has dividido la imagen en varias texturas de potencia de 2, dibujas un sprite con cada una de ellas o como lo haces?

Gracias de nuevo.
Un saludo!!                                
here are only 10 types of people: those who understand binary and those who don't

Repoker

                                Donde haya un buen glLoadIdentity(); .. que se quite lo demás  :D

tsk tsk .... gl roxorz ..                                






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.