Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Lio Con 16,24,32 Bits De Color En Direct3d

Iniciado por Loover, 29 de Diciembre de 2003, 12:43:29 AM

« anterior - próximo »

Loover

 Creía que tenía claro estos conceptos pero me he hecho un lio.
A ver, en OGL tenía una aplicación que al crearla te dejaba elegir entre 16 y 32 bits de color. Al crear el render, le pasaba como parámetro (entre otros como el tamaño de ventana) el bpp 16/32. Luego, cuando ogl creaba las texturas yo solo tenía que indicarle donde estaba el array de bytes y su formato (GL_RGB, GL_RGBA, etc). Tan simple como eso.

Ahora, desde D3D me he hecho un lio tremendo. Pensaba que iba a ser de la misma mangera pero las cosas cambian hasta la manera de inicializarlo. Ojeando la ayuda, llegué a pensar que usando D3DDISPLAYMODE y dándole el formato:
- D3DFMT_R5G6B5 Sería 16 bits
- D3DFMT_A8R8G8B8 Sería 32 bits
Aunque no tenía ni idea de que para que servía especificar el alpha en el backbuffer ese.

Así que usando un array de bytes en formato RGBA probé a cargar la textura usando D3DFMT_A8R8G8B8 y al dibujarla a pantalla completa, tanto en lo que yo creía que iban a ser 16 como 32 bits se veía como de 32 bits. Así que dije, pues habrá que cargar la textura con D3DFMT_R5G6B5. Pero claro, al tener el array de bytes de 4 en 4 bytes (RGBA) mal rollo, salía mal dibujada.

Vamos, que ando despistado  :blink:  y no sé como hacer algo tan simple como que el usuario elija entre 16 y 32 bits en Direct 3d. Me gustaría que me aclararais todo esto un poco, gracias.

PD: Si ya de paso me hablais sobre el modo 256 colores (usando paletas y tal) os invito a un cubata  (ole)  
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 Es que puedes tener formatos diferentes de textura y de backbuffer. Quizás ese es tu problema, que asumes que son iguales. Pero si quieres que lo sean, tienes que forzarlo tu mismo al crear la surface de la textura.


Loover

 Madre mía como se complica la vida direct3d para algunas cosas  (grrr)

Entonces puedo tener un backbuffer de 16 bits y si cargo una textura con formato de 32... ¿se ve como de 32? ¿Entonces para que sirve darle al backbuffer un formato u otro?

Por otro parte... ¿ahora tendría que pasar mi array en RGB de 3 bytes a RGB de 2 bytes para que Direct3d pueda crear la textura D3DFMT_R5G6B5? Dios que follón. Prefiero mil veces como lo hace OGL. ¿Hay alguna forma de hacer el paso de 3 bytes a 2 bytes sin tener que currarme una función propia? (me veo tirando de ensamblador :S)

De todas formas sigo bastante perdido, si alguien sabe de alguna web donde expliquen detalladamente todo esto se lo agradecería un montón.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 --Entonces puedo tener un backbuffer de 16 bits y si cargo una textura con formato de 32... ¿se ve como de 32? ¿Entonces para que sirve darle al backbuffer un formato u otro?

Tu backbuffer puede ser del tamaño que quieras, luego es la targeta que al mostrarlo lo reconvierte al formato indicado. En modo ventana, por ejemplo, puedes tener un backbuffer de 32 bits, pero el monitor a 16 y lo que hace la targeta es convertir finalmente esos 32 en 16, pero para ti es completamente transparente. Esto, desde mi punto de vista, es muy muy positivo, porque te permie trabajar en coma flotante y luego mostrarlo en un dispositivo de 32 bits.

Quizás no lo entiendas todavía, te pondré el mismo ejemplo con el sonido. Imagínate que tienes que grabar un sonido y escucharlo. Si lo grabas a 16 bits y haces efectos de eco y otras cosas, después si lo escuchas a 8 bits tendrá menos calidad, pero para ti ya debería ser indiferente puesto que lo has preparado a 16 bits y así "bajar" de calidad es más fácil. Ahora imagínate que lo hubieras grabado a 8 y hubieras hecho los efectos de eco. Aquí ya habrías perdido calidad, y nunca lo podrías escuchar a 16 bits.

No tiene nada que ver el backbuffer con lo que vemos en pantalla. Sin embargo hay pocas tarjetas que puedan hacer esta transición. Si quieres saber si la tuya puede, cógete cualquier demo del SDK de DX, cambia el modo de vídeo y elige un backbuffer diferente a tu profundidad de escritorio.  ;)

--Por otro parte... ¿ahora tendría que pasar mi array en RGB de 3 bytes a RGB de 2 bytes para que Direct3d pueda crear la textura D3DFMT_R5G6B5? Dios que follón. Prefiero mil veces como lo hace OGL. ¿Hay alguna forma de hacer el paso de 3 bytes a 2 bytes sin tener que currarme una función propia? (me veo tirando de ensamblador :S)

Si sigues con el tema bytes, lo llevas chungo. En DX no uses el sistema que dices, usa las propias librerías D3DX que te permiten virguerías sin tener que escribir apenas código. Por ejemplo, yo cargo TODO lo que puedo de texturas ya en formato DTX1, que ahorra memoria de vídeo, y sólo tengo que indicarlo en una función. ¿puede ser más fácil?

Loover

 Ah, muchas gracias, ya empiezo a aclararme.

He resuelto el problema de crear una textura del formato que yo quiera teniendo un array de bytes en memoria en otro formato.
Imaginemos que tengo un array de datos RGB de 3 bytes por pixel. Y sinembargo quiero crear una textura de tan solo 2 bytes por pixel (D3DFMT_R5G6B5).

Sigo estos pasos:
1) Creo una textura por ejemplo D3DFMT_R5G6B5;
2) Ahora, en vez de lockear la textura. Relaciono una superficie  con la textura (con GetSurfaceLevel)
3) Con D3DXLoadSurfaceFromMemory indico que los datos fuentes del array de bytes tienen el formato D3DFMT_R8G8B8 y el bpp = 3.
4) Luego libero la surface y en la textura se ha cargado todo haciendo el solito la conversión.
5) ¡¡¡ Bien  (uoh) !!!

Si en el paso uno pongo por ejemplo D3DFMT_A8R8G8B8 y miro la memoria usada. Esta es mayor, aunque no el doble, porque parece ser que el ancho real de las texturas no siempre es igual al nº de bytes por pixel * ancho sino que a veces se reservan más bytes al final (¿quizás para tener en cuenta el formato del backbuffer?).

Un saludo y gracias!

PD: Me ha ayudado mucho este código del Nébula Engine: http://nebuladevice.sourceforge.net/doc/do...8cc-source.html
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Loover

 Ah, otra pregunta.

Me gustaría que el usuario pudiera elegier entre blanco y negro, 256, 16bits y 32bits colores.
¿Sería correcto inicializar el backbuffer a D3DFMT_A8R8G8B8 y luego el usario, al cargar la imagen, eligiera la  su calidad?
Ejemplo: CreateImage ("perro.png", LOV_256);

Se crearía en formato D3DFMT_R3G3B2.

Así ahorro memoria, eso seguro, lo he comprobado. Lo que no me queda claro es si  teniendo el backbuffer en formato D3DFMT_A8R8G8B8 habrá algún tipo de problema o estoy haciendo alguna tontería.

IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 Creo que el formato de 256 colores ya no se soporta desde hace tiempo.

Las texturas pueden tener el formato que quieras, al pasarlas al backbuffer el hardware hace el cambio.

Loover

 Ok, gracias.
Pues a mi si me va el D3DFMT_R3G3B2 (8bits = 256 colores) y está en la ayuda puesto.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 Bueno, es que yo creía que te referías a paletas de 256 colores, el antiguo VGA. No me imagino como debe verse algo a R3G2B3 !!

BeRSeRKeR

 Según el "Caps Viewer", mi Radeon 9600 no soporta el formato de textura D3DFMT_R3G3B2.

Realmente, ¿quién utilizará eso en estos días? ;)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Loover

 No lo soporta????  :blink:
Pues los sprites de pocos colores se ven muy bien con eso y me van bastantes fps más rápidos. Jorl, como puede ser que no lo soporte la 9600 :(
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

BeRSeRKeR

 Bueno, que alguien que tenga aceleradoras parecidas o de gama más alta confirmen si sus aceleradoras soportan ese formato.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Loover

 Espera, a lo mejor estas mirando el CAP de Display Mode y no el de Texture Format...
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

BeRSeRKeR

 Esto es lo que estoy mirando:



Dentro de cada formato del adaptador (Adapter Formats) hay una opción que es Texture Formats. Eso es lo que estoy mirando.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Loover

  (rules) Vaya, que putada. Nada, fuera el modo 256 colores. Total poca gente lo iba a usar. Paso de consultar la cap para que puedan usarlo solo unos pocos. Que raro que mi cutre Radeon 7200 los soporte todos. Todos los de salen en layuda de Dx9.

Una pregunta, ¿tienes estos formatos de textura?
D3DFMT_L8, D3DFMT_A8L8, D3DFMT_L16. (grises)
D3DFMT_A4R4G4B4 (16 bits con alpha)

Un saludo y gracias cartagenero ;)
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






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.