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 »

MChiz

                                Yo diria que la cara no utiliza el modo de blending ONE. Pero bueno, creo que ahora ya te entiendo. Es mas, creo que, teoricamente, lo que quieres hacer, no se puede hacer. Te explico:
Con el modo de blending ONE no tienes problemas, porque las zonas donde no hay nada en la textura, vale cero. El modo de blending ONE es aditivo, por lo que suma a lo que hay en el frameBuffer, el fragmento de la textura que le toca. Y asi tienes que si le sumas 0, el pixel se queda igual. Ahora bien, el modo de blending que quieres hacer es combinativo, por lo que multiplica. Asi tienes que cuando multiplicas por 0, se queda negro. Me he remirado una vez mas las imagenes que has puesto anteriormente, y estoy casi 100% seguro de que lo que necesitas es el AlphaTest.
A ver si lo puedes probar rapido y me dices algo : )                                

[EX3]

                                Con el D3DBLEND_ONE si me respeta el ColorKey, por ke el fondo del sprite es azul puro RGB(0,0,255), si tuviese ke pintar toda la textura el fondo tb se veria. Aki tienes la imagen:

http://usuarios.lycos.es/dxlib32/images/Te...est/Soldier.bmp (72k)

En D3D7 el uso del ColorKey se activaba desde SetRenderState:
Device.SetRenderState D3DRENDERSTATE_COLORKEYENABLE, 1
pero en D3D8 no esta ese codigo. En D3D8 el ColorKey parece estar activo con estas lineas:
Device.SetRenderState D3DRENDERSTATE_ALPHABLENDENABLE, 1

Device.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA

Device.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA


Estas lineas si no me equivoco son las ke se usan para hacer AlphaBlend.
Seguire probando el AlphaTest, a ver si con el soluciono el problema.

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

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

MChiz

                                Si en D3D7 tenias que activar el ColorKey, quiere decir que en D3D8 tendras que activar AlphaTest. Estoy seguro.
Y sobre lo que dices del modo de blending ONE... la imagen que utilizas tiene canal alpha?                                

[EX3]

                                Ke va, simplemente son BMPs normales y corrientes.                                
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

MChiz

                                Entonces no lo entiendo...
En fin, dale al AlphaTest y ya me diras. Siento no saber como darte mas ayuda : (                                

[EX3]

                                Mas ke nada darte las gracias por haberlo intentarlo  :D                                
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

MChiz

                                De nada hombre!! Ojala pudiera darte mas ayuda. No tienes porque darme las gracias : )
Suerte con el tema!                                

Zaelsius

                                Bueno, aquí está la solución al problema, y sé que funciona ;-)


-Utiliza D3DXLoadTextureFromFileEx() para cargar la textura, teniendo en cuenta el parámetro ColorKey. El prototipo es:





HRESULT D3DXCreateTextureFromFileEx(LPDIRECT3DDEVICE9 pDevice,

   LPCTSTR pSrcFile,

   UINT Width,

   UINT Height,

   UINT MipLevels,

   DWORD Usage,

   D3DFORMAT Format,

   D3DPOOL Pool,

   DWORD Filter,

   DWORD MipFilter,

   D3DCOLOR ColorKey,

   D3DXIMAGE_INFO *pSrcInfo,

   PALETTEENTRY *pPalette,

   LPDIRECT3DTEXTURE9 *ppTexture

);





Ahí especificas el color que indicará las zonas SIEMPRE TRANSPARENTES.

-Utiliza D3DXSprite para dibujar, ya sea mediante Draw() para 2d o DrawTransform() para 3d. Con el parámetro Color PUEDES TANTO MODULAR EL COLOR COMO LA TRANSPARENCIA FINAL del sprite dibujado.





HRESULT Draw(          LPDIRECT3DTEXTURE9 pSrcTexture,

   CONST RECT *pSrcRect,

   CONST D3DXVECTOR2 *pScaling,

   CONST D3DXVECTOR2 *pRotationCenter,

   FLOAT Rotation,

   CONST D3DVECTOR2 *pTranslation,

   D3DCOLOR Color

);





Luego con una llamada del tipo:



miSprite->Draw(..,..,..,..,..,D3DCOLOR_RGBA(255,255,255,128));



Pintas el sprite con su color original, pero al 50% de transparencia.

Hay dos maneras más de hacer esto, pero una es guarrenado con la API de WIn32 al cargar las texturas y la otra es mediante PixelShaders.

Más información la puedes hallar en los tutoriales de DX de http://www.32bits.co.uk, donde se discute este tema, y se realizan varias clases para encapsular sprites, etc. Para mí son los mejores tutoriales, y no está de más leerselos aunque ya creas que sabes DX, porque
siempre comentan otras cosillas sobre la marcha y que conviene saber.

Más concretamente te puedes bajar el tuto de sprites, compilarlo, y probar a modificar algunos valores.                                

[EX3]

                                Las texturas las cargo con esa funcion, ya ke si no no podria especificar el ColorKey.

Todavia tengo ke implementar en el modulo grafico la clase D3DXSPRITE, por ke todavia trabajo al metodo antiguo (crear el poligono y pintar la textura).

Voy a ojear los tutos de esa web, lo malo es ke no podre sera compilar los ejemplos para probarlos, ya ke trabajo en VB y no tengo a mano el VC++ (se me casco el CD :-? ) pero con los tutos me basta.

Muchas gracias por la ayuda, ZaelSius!  :D

MChiz, si consigues hacer algo con el AlphaTest me gustaria ke me lo enseñaras, ok? y si lo consigo yo, lo mismo. :ojo:

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

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

MChiz

                                De acuerdo! : ) Pero no se cuando me pondre a ello. Tengo muchas cosas que hacer : (
Espero que te salga pronto.                                

[EX3]

                                Si no son examenes son trabajos, etc... ,si tamos todos casi igual, la vida del estudiante, ke dura es  :D                                
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

[EX3]

                                Sigo sin conseguir ke el AlphaTest tire y tampoco logro el AlphaBlend con le metodo de los vertices (si he conseguido tintar las texturas al dibujarlas, pero el parametro Alpha se lo pasa por el forro). O algo sigo haciendo mal o algo me he dejado por el camino, nu se  :-?.

MChiz has logrado hacer funcionar el AlphaTest?

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

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

MChiz

                                : ((((
Que va, lo siento muchisimo, en serio. Ahora estoy con otros temas, antes de pasarme a D3D.
Pero he encontrado algo que quizas pueda ayudarte:
http://www.computersciencelab.com/Direct3DTut1.htm

Si no te sirve, mira de buscar en google.
Suerte!                                

[EX3]

                                He ojeado la web, ke por cierto me ha parecido interesante, y he visto como se inicializa el AlphaTest. La ayuda del SDK lo inicia igual, y asi lo tengo en el motor:
Device.SetRenderState D3DRS_ALPHATESTENABLE, 1

Device.SetRenderState D3DRS_ALPHAREF, &H1

Device.SetRenderState D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL

pero no veo ke haga nada en particular  :-?.

Seguire buscando y revisando el codigo. Lo dicho, si logro hacer ke tire te aviso  :ojo:

Gracias :D

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

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

MChiz

                                Me alegro que te haya gustado la web, pero siento que no te sirviera de nada : ((((
Espero que te salga pronto. Avisa, ehh!?? :bb
Adioos!!                                






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.