Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Vertex Buffers?

Iniciado por •Parra, 29 de Junio de 2009, 09:21:48 PM

« anterior - próximo »

•Parra

Hola de nuevo ^^

Bueno.. como ya dije que haria, vine para postear alguna imagen segun iba avanzando el proyecto :P




Y bueno, tenia una duda que se me planteó al hacer el sistema de particulas.. y es que me realentiza mucho.. =/ Sin particulas llegaba a 3000 fps.. y ahora con particulas solo a 180, pero es porque tengo que hacer un drawprimitiveup por cada particula..

Me preguntaba si habia alguna manera más rapida de renderizar.. si con vertex buffers, o algo parecido.. que me han comentado (muy poco..) si podia hacer esto más rapido..

Si tienen alguna idea de como podria hacerlo me gustaria escucharla ^^ (Y si me sirbe.. ver si se puede usar tambien en el renderizado normal de texturas..)

[EX3]

Cita de: •Parra en 29 de Junio de 2009, 09:21:48 PM
Y bueno, tenia una duda que se me planteó al hacer el sistema de particulas.. y es que me realentiza mucho.. =/ Sin particulas llegaba a 3000 fps.. y ahora con particulas solo a 180, pero es porque tengo que hacer un drawprimitiveup por cada particula..

Me preguntaba si habia alguna manera más rapida de renderizar.. si con vertex buffers, o algo parecido.. que me han comentado (muy poco..) si podia hacer esto más rapido..
En vez de llamar una vez por particula a DrawPrimitiveUp monta un array con todas las particulas y las envias en una sola llamada a DrawPrimitiveUp con el flag D3DPT_POINTLIST en el parametro PrimtiveType. Eso ira considerablemente mucho mas rapido a la hora de dibujar las particulas.

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

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

•Parra

#2
Como envio el array completo? tienes un ejemplo? =/

yo lo tengo asi: (pero está fatal..)

Código (vb) [Seleccionar]
         Dim i As Long
         
         For i = 1 To particleGroup.pCount
         
            .DrawPrimitiveUP D3DPT_POINTLIST, particleGroup.pCount , particleGroup.particleInfo(i).vertexPoints(0), Len(particleGroup.particleInfo(i).vertexPoints(0))
       
        Next i

[EX3]

#3
Salvo que tengas algo raro deberia funcionar. Esta es la llamada que usa dx_lib32 tanto para pintar sprites como primitivas, incluidas las listas de vertices o puntos:
Código (vbnet) [Seleccionar]
Call d3dDevice.DrawPrimitiveUP(.PrimitiveType, .PrimitiveCount, .Quad(0), Len(.Quad(0)))
PrimitiveType guarda el valor de la constante a pasar (en este caso D3DPT_POINTLIST), Quad es un array de tipo D3DTLVERTEX) y PrimitiveCount es el numero de elementos de Quad (de 0 a n).

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

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

•Parra

Claro pero yo lo tengo asi.. lo unico que cambia es que tengo un Quad por cada particula..

como podria cambiar eso?

No se como me quieres decir tu =/

[EX3]

#5
Amigo, yo pensaba que creabas las particulas mediante simples pixeles :P La verdad que el usar sprites tiene la ventaja de que reduces el numero de particulas a dibujar y puedes conseguir un resultado practicamente igual, pero de ser asi mi metodo no te vale, ahi si tendrias que usar vertexbuffers o el mecanismo de turno que te permita almacenar varios vertices agrupados (poligonos) y poder dibujarlos en una sola llamada. Ahi poco puedo decirte por que jamas he usado uno, aunque creo, por que no lo he probado, el sistema deberia funcionar igual para lista de vertices sueltos que para agrupaciones de poligonos, dicese, al array que le pasas a DrawPrimitiveUP meterle todos los vertices de todos los quads que quieras renderizar e indicarle el numero de quads a la funcion usando el parametro D3DPT_TRIANGLELIST o quizas D3DPT_TRIANGLEFAN:

Código (vbnet) [Seleccionar]
Call DrawPrimitiveUP(D3DPT_TRIANGLELIST, numero_quads \ 2, arrayQuads(0), Len(arrayQuads(0))
' numero_quads \ 2 = numero de triangulos a dibujar (1 quad = 2 triangulos).


Pero claro, esto solo vale para la misma textura, aunque supongo que para las particulas usas la misma textura. Intentalo y me dices, a ver si funciona :)

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

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

•Parra

#6
van subiendo algo los fps.. y no termina de verse igual =/ se ven menos particulas si le bajo eso..

estaria bueno lo de vertex buffers.. si tienes un poco de idea.. de donde encontrar un tutorial o algo asi, te agradeceria..

Yo el procedimiento de renderizado lo tengo asi ahora:

Código (vb) [Seleccionar]
Private Sub particleGroupRender(ByRef particleGroup As structParticleGroup)

    With D3DDevice
   
        .SetRenderState D3DRS_POINTSPRITE_ENABLE, 1 'True
        .SetRenderState D3DRS_POINTSCALE_ENABLE, 0 'True
        .SetRenderState D3DRS_POINTSIZE, particleGroup.lngFloatSize
        .SetRenderState D3DRS_POINTSIZE_MIN, particleGroup.lngFloat(0)
        .SetRenderState D3DRS_POINTSCALE_A, particleGroup.lngFloat(0)
        .SetRenderState D3DRS_POINTSCALE_B, particleGroup.lngFloat(0)
        .SetRenderState D3DRS_POINTSCALE_C, particleGroup.lngFloat(1)
        .SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
        .SetRenderState D3DRS_DESTBLEND, D3DBLEND_ONE
        .SetRenderState D3DRS_ALPHABLENDENABLE, 1
         
        .SetVertexShader (D3DFVF_XYZRHW Or D3DFVF_DIFFUSE Or D3DFVF_TEX1)
                 
        .SetTexture 0, particleGroup.pTexture
         
         
         Dim i As Long
         
         For i = 1 To particleGroup.pCount
         
            .DrawPrimitiveUP D3DPT_POINTLIST, particleGroup.pCount / 2, particleGroup.particleInfo(i).vertexPoints(0), Len(particleGroup.particleInfo(i).vertexPoints(0))
       
        Next i
    End With

End Sub


Edit: ya está listo!! ^^

Rehize el sistema.. y ahora me va perfecto :P listo, pueden cerrar! Gracias por todooo!






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.