Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Blitear Surfaces En D3d8 Respetando El Colorkey

Iniciado por [EX3], 28 de Febrero de 2005, 12:18:39 PM

« anterior - próximo »

[EX3]

 Wenas. Trasteando estos dias me encontre con un pequeño problemilla intentando blitear unas Surfaces dentro  de otras y es que no me respeta el Colorkey para la transparencia de las mismas, la zona que se supone que no se deberia dibujar, que tendria que ser transparente la pinta con el color del valor del ColorKey. Estoy usando la funcion D3DX8.LoadSurfaceFromSurface(). Se pueden blitear Surfaces en el backbuffer o en otra superficie respetando el color de transparencia como se hacia en DirectDraw, sin que se borren los pixeles de la surperficie de destino?

Otra cosa, no se si tendra relacion o no, pero la documentacion del SDK de DirectX respecto al tema hace referencia a las SwapChains pero no he entendido bien para que sirven en concreto. Si alguien fuese tan amable de poder explicarmelo se lo agradeceria.

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

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

Sacrifai

 ¿Podrías copiar el codigo del blit? ¿Puede ser que lo hayas puesto a 16 bits (no se si esto peta el alpha) o que no estes definiendo para que es el colorkey correctamente?

[EX3]

 No tiene por que ser problema de 16 o 32 bits de color ya que siempre trabajo a 32 bits con los graficos en memoria, y bliteando Texturas no tengo el problema del ColorKey. El codigo de la funcion de bliteo es el siguiente:
'Funcion extendida de SURF_BlockCopy:
Public Function SURF_BlockCopyEx(SrcMap As Long, DestMap As Long, SrcRect As GFX_Rect, DestRect As GFX_Rect, ColorKey As Long) As Long
On Error GoTo ErrOut
Dim rct(1) As RECT

With rct(0)
   .Left = SrcRect.X
   .Top = SrcRect.Y
   .Right = SrcRect.Width
   .bottom = SrcRect.Height
End With

With rct(1)
   .Left = DestRect.X
   .Top = DestRect.Y
   .Right = DestRect.Width
   .bottom = DestRect.Height
End With

Call D3DX.LoadSurfaceFromSurface(m_Surf(DestMap).data, ByVal 0, rct(1), m_Surf(SrcMap).data, ByVal 0, rct(0), D3DX_DEFAULT, ColorKey)

SURF_BlockCopyEx = 1
Exit Function

ErrOut:
End Function

Esta funcion copia toda o parte de una superficie dentro de otra con o sin escalado y se "supone" que el ColorKey es el color de transparencia que no se "deberia" dibujar al copiar la superficie en la de destino, justo como sucede en DirectDraw, tu dibujas una superficie sobre otra y si el ColorKey es RGB(0,0,255) los pixeles azules no se pintan, dejando ver los que estan debajo. No se por que en DirectsGraphics me pinta los pixeles del ColorKey borrando los de la superficie de destino con dicho color. Por eso pregunto si se puede hacer o no.

Salu2...

P.D.: Si alguien se pregunta el por que de la estructura GFX_Rect la razon es muy simple, la funcion se encuentra dentro de una dll y al necesitar usar la estructura RECT como publica no puedo declarar dicha estructura para utilizar como argumento publico ya que esta declarada en DirectX y provoca error de declaracion duplicada o tipo de argumento no esperado, esto al menos en VB.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

Juan Mellado

 
Cita de: "[EX3"]... si el ColorKey es RGB(0,0,255) ...
¿Qué alpha estas poniendo?

Según la documentación, debería ser 0xFF:


ColorKey
[in] D3DCOLOR value to replace with transparent black, or 0 to disable the colorkey. This is always a 32-bit ARGB color, independent of the source image format. Alpha is significant and should usually be set to FF for opaque color keys. Thus, for opaque black, the value would be equal to 0xFF000000.


Saludos

[EX3]

 
Cita de: "Juan Mellado"
Cita de: "[EX3"]... si el ColorKey es RGB(0,0,255) ...
¿Qué alpha estas poniendo?

Según la documentación, debería ser 0xFF:
Ahi me estaba refiriendo a DirectDraw, que no trabaja con el canal Alpha. En D3D, como ya decia, trabajo en 32Bits RGBA pasando un valor RGBA(0,0,255,255), no ARGB como segun veo pide DirectX pero tb he probado con ARGB y tampoco, y el resto de funciones que uso no me dan problema alguno con el ColorKey. Si el tema es que lo que se deberia ver transparente se ve con el color del ColorKey que especifico:
+ =

Cuando deberia hacer esto:
+ =

Es correcto el 1º resultado que me da la funcion o es que no se penso para lo que yo pretendo?

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.