Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con el canal Alpha al intentar efecto en textura

Iniciado por [EX3], 10 de Enero de 2008, 10:51:24 AM

« anterior - próximo »

Pogacha

Pruebalo así, pero deberia estar andando.
   // Pasada 1
   SetTextureStageRender(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
   SetTextureStageRender(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1)

   SetTextureStageRender(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE)
   SetTextureStageRender(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1)

   SetTextureStageRender(1, D3DTSS_COLOROP, D3DTOP_DISABLE)

   SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO)
   SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)

   SetTexture(0, Textura)
   DibujoTextura()

   // Pasada 2
   SetRenderState(D3DRS_TEXTUREFACTOR, D3DColorMake(0.299, 0.587, 0.114, 1.0) )
   SetTextureStageRender(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
   SetTextureStageRender(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
   SetTextureStageRender(0, D3DTSS_COLORARG2, (D3DTA_TEXTURE Or D3DTA_ALPHAREPLICATE) )
                                 
   SetTextureStageRender(1, D3DTSS_COLORARG1, D3DTA_CURRENT)
   SetTextureStageRender(1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3)
   SetTextureStageRender(1, D3DTSS_COLORARG2, D3DTA_TFACTOR)
                                 
   SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE)
   SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE)

   SetTexture(0, Textura)
   DibujoTextura()

[EX3]

Le he modificado un par de estados y excepto por el alpha del canal de la textura ya lo pinta en escala de grises y con posibilidad de modular la opacidad mediante el alpha del color de los vertices, tal y como hago en el resto de efectos:



El codigo:
D3DDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_DISABLE
D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 Or D3DTOP_MODULATE
                                   
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA

                               
D3DDevice.SetRenderState D3DRS_TEXTUREFACTOR, D3DColorMake(0.299, 0.587, 0.114, 1.0)
D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
D3DDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG2, (D3DTA_TEXTURE Or D3DTA_ALPHAREPLICATE)
                                   
D3DDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
D3DDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3
D3DDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_TFACTOR
                                                                     
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_ZERO
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA


Tomando este punto, voy a ver si soy capaz de aplicar el canal alpha de la textura y ver si remato el asunto. Estaba pensando en si alguno de los estados de textura me permite definir un colorkey. Mi idea sera hacer que tomara el negro RGBA(0,0,0,1.0) como color de mascara para que no lo dibuje. Estoy mirando pero no me aclaro mucho con la documentacion, estoy leyendo acerca de la constante D3DTA_SELECTMASK pero me parece que el uso es bien distinto al que busco. Hay forma de definir mascara de color mediante estados o alguna triquiñuela para indicar un color como transparente?

Ya te debo 2, Pogacha, mil gracias :D

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

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

Pogacha

La idea de lo que el codigo deberia hacer es:

Siendo el alpha blending:
Src = TexturaRGB Dot3 GreyScaleFactor
Dst = Src * SrcAlpha + Dst * (1-SrcAlpha)

Como el Dot3 se replica a todos los canales, perdemos el alpha con lo que debemos hacer dos pasadas.

Pasada 1:

Dst = Dst * (1-SrcAlpha)

Pasada 2:

Dsp = Dst + Src * SrcAlpha;

La primera pasada no te anda pero deberia sin mas.
La ecuacion de blending debe ser Src * Zero  + Dst * InvSrcAlpha

Para la segunda pasada tenemos que multiplicar el alpha por el color por eso en el primer stage hacemos que el alpha se replique a todos los canales y lo modulamos por el color.
O sea
Stage1Result.r = Src.r * Src.a
Stage1Result.g = Src.g * Src.a
Stage1Result.b = Src.b * Src.a
Stage1Result.a = Src.a  // este nos olvidamos
En el segundo stage tomamos este resultado y hacemos el dot3

Curr = Stage1Result

Stage2Result.rgba = Curr.r * GreyScaleFactor.r + Curr.g * GreyScaleFactor.g + Curr.b * GreyScaleFactor.b

Y el blending debe ser:
Dst = Stage2Result * ONE + Dst * ONE

En teoria la primera pasada debe dejarte el hueco negro de la silueta, has andar esto.

Si pones la segunda pasada solo deberia ponerte en escalas de grises pero de modo aditivo, como un reflejo en un espejo.

Saludos

[EX3]

Cita de: "Pogacha"En teoria la primera pasada debe dejarte el hueco negro de la silueta, has andar esto.
Te refieres a esto?

Cambiando el estado D3DTSS_COLOROP de D3DTOP_DISABLE a D3DTOP_MODULATE.

Cita de: "Pogacha"Si pones la segunda pasada solo deberia ponerte en escalas de grises pero de modo aditivo, como un reflejo en un espejo.
Lo hace pero pintando el fondo opaco e invirtiendo los colores:


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

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

Pogacha

Ok, has la primera pasada y la segunda pasada asi como me mostraste arriva pero cambia esta linea en el segundo stage de la segunda pasada

D3DDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT

por

D3DDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT Or D3DTA_COMPLEMENT

me muero por saber si con esto andara!

[EX3]

Weno, diria que algo ha salido, el fondo ya no se pinta pero la escala de grises se ha ido "casi" por completo :D



Digo "casi" por que fijate que algunos pixeles han quedado transparentes, en la rodilla por ejemplo, lo que supongo que querra decir que esta afectando algo al resultado del paso anterior.

Salu2...

EDIT! Casi lo he sacado! :D (casi por que simplemente sale algo oscura)



He añadido el flag  D3DTA_COMPLEMENT en el argumento D3DTSS_COLORARG1 y los estados de blending SrcBlend a InvSrcColor y DestBlend a InvSrcAlpha del stage 0 de la 2º pasada y ha salido el asunto. Ahora a ver si logro que la luminosidad sea la correcta.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

Pogacha


[EX3]

Por supuesto:


El reborde "dentado" de color blanco que aparece es por un fallo de la textura, no de codigo. La textura inicialmente tenia el fondo de color solido y al pasarlo a alpha se solapo con el contorno del sprite.

Digamos que he logrado el tono correcto (comparandolo con la textura original pasada a escala de grises con Photoshop) pero sigo teniendo un ligero fallo por culpa de los estados de blending que hace que los pixeles blancos no los pinte. En esta textura se aprecia mejor:



Añado otro problema y es que la modulacion de opacidad mediante el componente alpha del color de los vertices oviamente tampoco me lo aplica en el resultado final, solo en el paso 1 lo que me vale de poco ya que el 2 paso se mantendra con opacidad aditiva :?

El codigo final es este, tuve que añadir un stage mas al 2º paso para invertir el color:
// Paso 1
D3DDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 Or D3DTOP_MODULATE
                                   
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_ZERO
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
                                   
// Paso 2
D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE Or D3DTA_COMPLEMENT
D3DDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG2, (D3DTA_TEXTURE Or D3DTA_ALPHAREPLICATE)

D3DDevice.SetRenderState D3DRS_TEXTUREFACTOR, D3DColorMake(0.33333, 0.33333, 0.33333, 1.0)
D3DDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
D3DDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3
D3DDevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_TFACTOR Or D3DTA_COMPLEMENT
                                   
D3DDevice.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_SELECTARG1
D3DDevice.SetTextureStageState 2, D3DTSS_COLORARG1, (D3DTA_CURRENT Or D3DTA_COMPLEMENT)
D3DDevice.SetTextureStageState 2, D3DTSS_COLORARG2, D3DTA_CURRENT
D3DDevice.SetTextureStageState 2, D3DTSS_ALPHAOP, D3DTOP_MODULATE Or D3DTOP_ADD // D3DTOP_MODULATE para intentar regular la opacidad mediante el alpha del color de vertice (sin exito)
                                                                     
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_SRCALPHA

D3DBLEND_ONE funciona tambien para el estado de blending pero ilumina de mas el resultado (que segun casos puede quedar mejor o peor). Mañana intentare seguir buscando forma de solucionar como minimo lo de que no pinte los pixeles blancos. La regulacion de opacidad por alpha de color de vertice me vendria de perlas pero podria vivir sin ella. Si se os ocurre algo bienvenido sea.

Una vez mas gracias, Pogacha, me ha resultado muy instructivo el dia de hoy referente al uso de los estados de textura & cia., al menos ya me entiendo mejor su funcionamiento :)

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

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






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.