Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas al hacer alphablend con Direct Graphics

Iniciado por [EX3], 06 de Mayo de 2003, 08:56:39 PM

« anterior - próximo »

AK47

                                Saludos
Yo tambien he estado trasteando con Direct3D 9 para pintar sprites para mi juego 2D. Hace tiempo use el D3DXSprite pero me iva terriblemente lento en mi savage 4 (es una patata pero bueno). Luego vi los experimentos que hizo un colega tirando de poligonos a pelo y me iva follao en mi cutre tarjeta. Resumiendo, tira de poligonos, ya que asi puedes optimizar el cambio de textura y tal.
Bueno, yo lo hago de esta forma:
Uso una perspectiva ortogonal.
Defino el formato del vertice como D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1.
Defino el quad con 2 poligonos y lo renderizo como un trianglestrip. El quad es de 1x1. Para pintar un sprite lo escalo al tamaño que requiero. Como uso una proyeccion ortogonal, al escalar el quad consigo una relacion de 1:1 entre el tamaño logico y tamaño de pixel. Osea que si escalo el sprite por 100 en X y 100 en Y, obtengo un sprite de tamaño 100x100 pixels.
Al cargar las texturas de los sprites con D3DXCreateTextureFromFileEx fijo el color que sera el colorkey. Las texturas tienen que ser potencias de 2, ya que sino la funcion escala la textura a la siguiente textura y el asunto queda hecho un asco.
Al pintar el sprite, realizo las siguientes operaciones:


g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);

g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);

g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); // Filtrado bilineal

Con estas operaciones consigo que no se pinten los pixels que son iguales al colorkey, y ademas, mediante el alpha del componente diffuse del vertice puedo definir el nivel de transparencia de los pixels que se pintan.
Se pueden cambiar los D3DTSS_COLOROP y D3DTSS_ALPHAOP para probar diferentes efectos. Obviamente, no se realizaran todas estas llamadas cada vez que se pinte un sprite, sino que se llamaran una vez, se pintaran los sprites y luego se desactivaran. Pero bueno, eso ya es relativo a la implementacion.
Espero que sirva de ayuda. A mi me sirve :)                                

[EX3]

                                Nas AK47, he probado tu codigo y... no me ha funcionado :llorando: (esto ya es desesperante) Lo unico que consigo es ke se me kede la pantalla en blanco (cuando RGBA(255,255,255,255), claro) pero vamos, ke ni alphablend ni nada. Mi programa esta maldito o yo estoy ciego!!!

Weno, ante todo muchas gracias por tu ayuda  :D

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

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

AK47

                                De nada hombre ;)
Cuando pongan el codigo de la semana que envie... (ejem) bajatelo. Es un ejemplo de Vertex Shader muy simple en 2D. El programa pone sprites en la pantalla saltando, rotando, cambiando de color y de nivel de transparencia, vamos, pone sprites usando Direct 3D sin tirar del ID3DXSprite ese :)                                

[EX3]

                                EUREKA!!!

Al fin lo consegui!!!  :D
Device.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
Esta linea es la que me ha solucionado el problema. Ya consigo hacer AlphaBlending y respetando el ColorKey. Encontre esta linea en el codigo que AK47 me posteo antes. Me dio por ir probando locuras y al final salio! Muchas gracias de nuevo a todos por vuestra ayuda!  :D

Salu2...

P.D.: AK47, estare encantado de echar un vistazo a ese codigo cuando lo subas, seguro que me sirve de ayuda en mi proyecto.  :ojo:                                
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

MChiz

                                : ))))))

Felicidades!!!!!!!                                

AK47

                                Mecauen la leche! Como que gracias a todos?  :enfadado: En fin... tendre que compartir con los demas tu gratitud... XDD
A ver cuando suben mi ejemplo de vertex shader. No es algo increible, pero muestra como cambiar ciertos valores sin hacer un solo lock :)                                

Zaelsius

                                Ahora antes de aprender C++ hay que aprender el MS Visual Copy-Pasting XD.

No sé como se te pudo pasar eso... :!:                                

BeRSeRKeR

                                ¡¡AK47 tio, no quieras llevarte toda la gloria!!  :ojo:

Este es uno de los primeros posts que puse (si no recuerdo mal el 4º). Fíjate en la 5ª línea del código...

CitarNo estoy seguro de entenderte....¿te refieres a por ejemplo especificar en el canal alpha un degradado de blanco a negro (pasando por todas las tonalidades de grises) y que después a la hora del render se realice la transparencia progresivamente?.

Si es eso, entonces los texture stage states necesarios serían, y lo digo de memoria ( y mi memoria es muy mala :jaja:):

g_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);

g_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);

g_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

// Esto es lo que hace el degradado progresivo

g_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);

g_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);


Hmm....por cierto, el texture factor no te hace falta para el alpha blending...a no ser que quieras conseguir alguna cosa rara :D...

Saludos

De todas formas, me alegro que lo hayas conseguido al fin :)

¡Ale, un saludo!                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

AK47

                                Vale vale berserker, no me llevo toda la gloria. Para ti un poquito, ala ;)                                






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.