Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Pintar Textura Dentro De Otras Texturas

Iniciado por [EX3], 05 de Agosto de 2003, 03:26:52 AM

« anterior - próximo »

[EX3]

 Nas:

Estoy buscando la forma de poder pintar texturas (aplicando efectos de alphablending, rotacion, etc...) y demas funciones graficas (Texto, lineas, etc...) dentro de otra textura. ¿Es posible? He conseguido poder pintar secciones de una textura dentro de otra con la funcion CopyRects() pero ahi no puedo aplicar efectos. ¿Alquien sabe como hacerlo?

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

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

BeRSeRKeR

 Para hacer que una textura rote, se escale, se desplace (haciendo un scroll), etc, lo mejor es que lo hagas a nivel de coordenadas de textura y no pixel a pixel que es lento. Es decir, modifica las coordenadas de textura a lo largo del tiempo y dependiendo de la transformación que utilices pues obtendrás una rotación, una traslación, un escalado, etc.

Esto es lo que hacen juegos como quake3 (por ejemplo, los saltadores redondos tienen aplicado un escalado que varía a lo largo del tiempo utilizando una función seno).

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

[EX3]

 Cuando pinto texturas en la pantalla con efectos de rotacion y traslacion lo hago a nivel de coordenadas, no de pixel (menudo palizon si no  (uoh) ) Yo lo que intento es hacer un simil de la funcion map_xput() del Div Game Studio, pintar graficos dentro de otros aplicando cualquier efecto como si pintase un grafico directamente en pantalla. ¿Se puede hacer?

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

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

Zaelsius

 Creo que lo que quieres hacer está enotro hilo reciente.

Es lo mismo pero harias un lock() por cada textura. De un buffer lees y en el otro escribes. Tendrás que tener cuidado al principio para escribir en las posiciones del buffer que correspondan a las x,y deseadas, pues dependerá del formato de la imagen/textura.

No intentes hacerlo con el backbuffer pq no se puede(sólo hay un formato en el que se puede, pero no vale la pena). Tb tienes que tener en cuenta que el acceso a pixeles de forma individual es muy lento.

Si quisieses hacer muchas operaciones de este tipo(muchas muchas, tampoco sé para que es lo que quieres hacer exactamente) en cada frame tendrías que recurrir a un pixel shader(para acelerar por hardware).

BeRSeRKeR

 [EX3], si quieres aplicar varias texturas a un polígono, ¿por qué no haces multitextura?...
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

[EX3]

 He visto un ejemplo ke creo ke es lo ke busco. Este utiliza superficies que utiliza para renderizar con la funcion CreateRenderToSurface(), pero no se por ke no me funciona:
Public Sub Draw_Surface()
On Error GoTo ErrOut

   Dim surf As Direct3DSurface8
   Dim rts As D3DXRenderToSurface
   Dim rtsviewport As D3DVIEWPORT8
   
   Set surf = TexDMA2.GetSurfaceLevel(0)
 
   rtsviewport.Height = 256&
   rtsviewport.Width = 256&
   rtsviewport.MaxZ = 0
   
   Call D3DDevice.GetDisplayMode(DispMode)
   Set rts = D3DX.CreateRenderToSurface(D3DDevice, 256&, 256&, DispMode.Format, 1, D3DFMT_D16)
 
   rts.BeginScene surf, rtsviewport

       D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1, 0
       
       D3DDevice.SetTexture 0, TexDMA
       D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Tile3(0), Len(Tile3(0))
           
   rts.EndScene

Exit Sub

ErrOut:
Beep
End Sub

El error me da en la siguiente linea:
rts.BeginScene surf, rtsviewport

El codigo esta basado en el ejemplo para VB del sdk Dx8 ScatterGraph, mas o menos por el final de la funcion BuildGraph() del formulario. Agradeceria ke alguien me explicara por ke falla.

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

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

BeRSeRKeR

 No sé cómo vendrá en el ejemplo del SDK pero si Draw_Surface se llama en cada frame, entonces será mejor que este trozo de código

CitarDim surf As Direct3DSurface8
   Dim rts As D3DXRenderToSurface
   Dim rtsviewport As D3DVIEWPORT8
   
   Set surf = TexDMA2.GetSurfaceLevel(0)

   rtsviewport.Height = 256&
   rtsviewport.Width = 256&
   rtsviewport.MaxZ = 0
   
   Call D3DDevice.GetDisplayMode(DispMode)
   Set rts = D3DX.CreateRenderToSurface(D3DDevice, 256&, 256&, DispMode.Format, 1, D3DFMT_D16)

lo hagas al principio de la aplicación.

No sé si será ese el problema pero de todas formas es mejor que tengas eso en un método al inicio.

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






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.