Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





sobre el accumulation buffer...

Iniciado por Emotion, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Emotion

                                He estado mirando ultimamente muchas cosas sobre graficos para implementarlas en mi motor, pero la unica que aun no me ha dado por implementar es el motion blur.

Por ahi he leido que la tecnica 'buena' es mediante el uso del accumulation buffer, sin embargo, tambien he oido por ahi que su uso sigue siendo prohibitivo en la mayoria de aceleradoras de consumo, pero claro... no se hasta que punto es cierto...

Por eso me gustaria que alguien me comentara que tal va el tema... es decir... si es cierto o no y me lo aclare un poco...

Gracias y un saludo
                               
G3: Get the Power!

Ithaqua

                                A día de hoy las aceleradoras no implementan por hardware las rutinas del accumulation buffer (=1fps).

Hay varias alternativas, principalmente 3. Yo el motion blur lo he hecho siempre con el render to texture (bueno, render normal y luego glCopyTexSubImage2D para uso posterior). Es óptimo incluso para escenas grandes.
Otra gente usa n renders superpuestos, pero solo vale para escenas relativamente sencillas.
Otra solución es no borrar el framebuffer, dibujar con alpha y cada frame ir disminuyendo la intensidad total (con un quad negro transparente por ejemplo). Algo parecido a como se hacía antiguamente en 2D.

 Saludos.

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Emotion

                                Hola Ithaqua,

O sea que lo que lei era cierto...

La verdad es que lo del render a textura lo he visto en multitud de sitios, lo que pasa es que supongo que al colocar un quad con la textura generada debes tener cuidado con la orientacion del quad para que no se aprecien efectos raros, no? Quiero decir, que la copia del objeto se viera demasiado desplazada con respecto al modelo 3d...

Saludos
                               
G3: Get the Power!

Ithaqua

                                No, ¿por que? La textura puesta entera sobre la pantalla tiene la misma proporción que el render normal. Lo único que cambia es la definición. Si tienes una tarjeta con buen fillrate puedes permitirte hacer un glViewport/glCopyTexSubImage2D de 512x512 por poner un ejemplo.
A mi me funciona a la perfección, y el método no solo vale para hacer motion blur, se pueden haber una verdadera burrada de efectos.

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Emotion

                                Ostias, es verdad... perdona, yo es que entre que hoy me he levantado con un mareo (el cual me sigue acompañando) de narices y que me he quedado sin mis frosties (trato de ser un chico sano :riendo:) llevo un dia fatal...

Yo es que estaba pensando en una proyeccion del modelo (tenia en mente las tipicas laminas de dibujo donde se proyectaban los puntos y se sacaban las vistas), pero eso es erroneo :sonriendo:

Sin embargo, que pasa si mueves la camara, es decir, imagina un juego de lucha donde uno de los golpes especiales del luchador es moverse mas rapido que el otro (una oportunidad perfecta para meter el motion blur), si la camara se alza sobre si misma, es decir, si asciende, mientras el personaje se mueve, tendria que coger y manipular los 'rastros' anteriores o tu coges y digamos que si tienes que poner 20 rastros los pones basandote en la proyeccion, bueno, en el modelo actual?
                               
G3: Get the Power!

Ithaqua

                                ¿De que método hablas? No hay proyección en ningún sitio, ni en ninguno de los métodos que te he dicho.

Cuidado con los mareos matutinos.
                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Emotion

                                Por eso digo... que tu lo que haces es simplemente copiar la misma imagen renderizada a textura tantas veces como 'rastros' quieras dejar, no?                                
G3: Get the Power!

Drácula

                                Exacto, Emotion, el problema del sistema del RenderToTexture es que no es 3D, y por tanto no puede resolver el problema que tu dices.

La única forma es renderizar en 2 pasadas el mismo objeto, o utilizar un vertex shader que hay en NVidia que lo hace en una pasada.

Yo soy partidario de que el Blur se haga en 3D, renderizando 2 veces con un Alpha.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Ithaqua

                                La textura va acumulando todos los frames anteriores, el quad solo se dibuja una vez por tanto.

En este método, por cada frame hacemos:

1- Viewport tamaño textura (ej 512x512)
2- Render sobre ese viewport
3- Quad textura motion blur por encima (alpha #1)
4- Copia del viewport hacia la textura (glCopyTexSubImage2D) (acumulamos).
5- Viewport normal (ej 800x600)
6- Clear z-buffer
7- Render
8- Quad motion blur por encima (alpha #2)

De alpha #1 depende el número de rastros, ya que este es el paso donde se van a ir acumulando los frames a medida que vamos renderizando a lo largo del tiempo.
De alpha #2 depende la intensidad con la que vemos el motion blur. Pero insisto en que solo una única textura incluye la acumulación de todos los frames que vamos dibujando.

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Emotion

                                OK, gracias por la aclaracion. Tan pronto como llegue a mi casa, lo probare :sonriendo:

Saludos
                               
G3: Get the Power!

Ithaqua

                                Drácula: 2 veces y uno/los dos con alpha? no entiendo como dices.
Supongo que te referirás al método de render con alpha activado, fade out, y solo zclear (no colorclear):

Frame:

1-Borrar z-buffer (pero no colorbuffer)
2-Render con alpha blending de todo.
3-fade out pequeño

No se si habrás probado el método, pero si lo haces te darás cuenta de que da problemas por la geometría dibujar todo con transparencia.
La solución sería hacer un sorting a nivel de polígono front to back, que como imaginas bien es bastante bestia :sonriendo:

Hacer un render to texture no tiene ningun problema, salvo que no es exacto 1:1 a nivel de pixel. No se nota si hay movimiento o si la textura es suficientemente grande (256x256 esta claro que no es suficiente).
De todos los métodos que he probado es el que mejores resultados da, y no sufre tanto como los demás en escenas complejas.

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Virtus

                                Please Ithaqua, puedes ser mas específico en tu paso:

3- Quad textura motion blur por encima (alpha #1)

y

8- Quad motion blur por encima (alpha #2)


Gracias.                                

NeLo

                                ¿Y si solo quieres motion blur en uno o varios objetos determinados?

_________________
"I have never let my schooling interfere with my education."
Mark Twain

[ Este Mensaje fue editado por: NeLo el 2002-09-03 17:50 ]                                
Drowning deep in my sea of loathing

Ithaqua

                                Virtus:

Me refiero a renderizar un quad sobre el viewport con la textura que usas para realizar el motionblur.
En el primer de los pasos que dices se realiza para no perder los renders de los frames anteriores (aquí el alpha indica el 'peso' que tienen los frames anteriores sobre el frame actual, a mayor alpha, más estela), y el segundo de los pasos es simplemente renderizar el motion blur sobre el frame final actual (el alpha indica el grado de intensidad con el que se dibuja el motion blur).

Nelo:

Tendrías que usar otro método que no maneje la escena entera :sonriendo:

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

mICrO

                               
Citar
El 2002-09-03 17:50, NeLo escribió:
¿Y si solo quieres motion blur en uno o varios objetos determinados?

_________________
"I have never let my schooling interfere with my education."
Mark Twain

[ Este Mensaje fue editado por: NeLo el 2002-09-03 17:50 ]


Bueno Nelo, si somos serios, es hora de ir a los shaders :lengua:

En el sdk del dx9  (no me acuerdo si venia en el del dx8) viene un bonito shader para hacer motion blur de single objects. Tambien en los examples de Nvidia creo que hay uno.

La verdad esque los shaders de single objects no quedan "igual" ya que se suele hacer 2 o 3 pasadas sobre un objeto y la estela es bastante mas cutre.


                               
ICrO : log off






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.