Haciendo un motion blur estilo Killzone2?

0 views
Skip to first unread message

Jon Valdés

unread,
Jan 26, 2009, 9:13:23 AM1/26/09
to code...@googlegroups.com
Hola buenas,

Viendo un documental [1] sobre el Killzone 2, me ha intrigado el
pedazo de motion blur que tienen.

El asunto es que tienen un render target con información de movimiento
en espacio de pantalla para cada pixel de la imagen, y luego usan eso
para calcular el radio y dirección del blur.

El asunto es... ¿cómo generan esa textura?

Una idea que se me ocurre es enviar siempre cada vértice de cada
objeto con un atributo adicional con las coordenadas 3D del anterior
frame, y calcular en el vertex shader la diferencia de posiciones
entre el frame anterior y el actual, y luego usar los datos
interpolados en el pixel shader para generar la textura... Pero esto
me parece muy bestia. Al final estás enviando el doble de información
de la necesaria a la tarjeta, y es información que se tiene que
actualizar cada frame... el ancho de banda de la tarjeta te lo vas a
comer con patatas haciendo eso... (además, que ahi habría que añadir a
esa diferencia el movimiento de la cámara, ya sea en la CPU o la GPU)

Otra idea también podría ser aprovechar que están usando la PS3, y
usar los SPUs para calcular el motion vector por cada vértice, y
pasarle a la gráfica los vértices con el atributo de velocidad en
espacio de pantalla ya calculado. Claro que ahi hace falta un proceso
bastante bestia de todos los vértices de la escena... y sin un culling
_muy_ bien hecho, vas a tener que calcular vectores para muuuchos
vértices.

¿A alguien se le ocurre alguna otra idea, o sabe cómo demonios lo han
hecho en realidad?

Enga, muchas gracias

Hasta luegooo

[1] http://www.gamekings.tv/index/videos/minidocu-the-company-behind-killzone-2-full-version-subbed/

Jesús de Santos García

unread,
Jan 26, 2009, 10:41:10 AM1/26/09
to code...@googlegroups.com
Con la matriz de camara del frame anterior y la de el actual tienes una manera muy barata de calcular una aproximación del vector de velocidad para cualquier punto de la pantalla. Es una aproximación porque no tiene en cuenta la oclusión de pixels de un frame a otro (pixels que antes se veian y ahora  no, o viceversa) y porque solo tiene en cuenta el movimiento de la camara y no del objeto. Para tener en cuenta el objeto, deberas pasarle las dos matrices (y para esto ya necesitas un rendertarget especial donde guardar las velocidades, pero tampoco es algo especialmente complejo).

Creo recordar que lei un articulo muy interesatene en el GPU Gems 3 sobre Motion Blur...

2009/1/26 Jon Valdés <jua...@gmail.com>

Jon Valdés

unread,
Jan 26, 2009, 11:16:47 AM1/26/09
to code...@googlegroups.com
2009/1/26 Jesús de Santos García <jesus.d...@gmail.com>:

> Con la matriz de camara del frame anterior y la de el actual tienes una
> manera muy barata de calcular una aproximación del vector de velocidad para
> cualquier punto de la pantalla. Es una aproximación porque no tiene en
> cuenta la oclusión de pixels de un frame a otro (pixels que antes se veian y
> ahora no, o viceversa) y porque solo tiene en cuenta el movimiento de la
> camara y no del objeto. Para tener en cuenta el objeto, deberas pasarle las
> dos matrices (y para esto ya necesitas un rendertarget especial donde
> guardar las velocidades, pero tampoco es algo especialmente complejo).

El asunto es que esta gente hace motion blur de las partes del cuerpo
individualmente. Ejemplo:
http://ps3.ign.com/dor/objects/748475/killzone-2/images/killzone-2-20080715040139476.html?page=mediaFull
En esa foto, la pierna del tipo está mucho más difuminada que el resto.

O en esta: http://ps3.ign.com/dor/objects/748475/killzone-2/images/killzone-2-20071203082038671.html?page=mediaFull
Ahi se ve como las piernas están más difuminadas que lo demás

> Creo recordar que lei un articulo muy interesatene en el GPU Gems 3 sobre
> Motion Blur...

Efectivamente, no lo había leido, gracias por el apunte ;) De todas
formas, en ese articulo se habla sólo del movimiento de la cámara, y
luego comenta un poco para objetos rígidos móviles, tal y como
comentabas tú.

Vamos, que de objetos con skinning y tal, no dice absolutamente nada.
Y viendo lo que aparece aquí (
http://www.farrarfocus.com/atom/090121.htm ) sobre tiempos que gastan
en este juego, parece que se dejan bastante tiempo en hacer el
skinning en los SPUs... asi que ¿estarán calculando la velocidad
per-vertex mientras hacen el skinning en los SPUs, y luego lo enviarán
a la gráfica como un atributo per-vertex?

Enga, muchas gracias

Hasta luegoo

Eduardo Castiñeyra

unread,
Jan 26, 2009, 11:26:06 AM1/26/09
to code...@googlegroups.com
Tendrías que mantener el arbol de transformaciones del frame n-1 en memoria principal. Y cada vez que subas un nodo, al cambiar de estado de ogl, actualizar tambien el uniform correspondiente al frame anterior en el vs. Lo mismo con los datos de skinning si lo hicieses con vs.

2009/1/26 Jon Valdés <jua...@gmail.com>

shash .

unread,
Jan 26, 2009, 11:39:17 AM1/26/09
to code...@googlegroups.com
Si no me equivoco que describes es esto:

http://www.dtc.umn.edu/~ashesh/our_papers/motion-blur.pdf

Hay otro paper/slides de nvidia, sobre la demo del ogro, pero no puedo
encontrarlos (los tengo archivados en el curro, a ver si mañana lo
encuentro).

Adeu,

shash

shash .

unread,
Jan 26, 2009, 11:41:04 AM1/26/09
to code...@googlegroups.com
Y dos, no falla, en el momento que le das a submit, encuentras el paper en cuestión:

http://developer.nvidia.com/docs/IO/8230/GDC2003_OpenGLShaderTricks.pdf

Estos son los slides que comentaba en el otro email :)

Adeu,

shash

El 26 de enero de 2009 15:13, Jon Valdés <jua...@gmail.com> escribió:

Jon Valdés

unread,
Jan 26, 2009, 12:00:26 PM1/26/09
to code...@googlegroups.com
2009/1/26 shash . <shas...@gmail.com>:

> Y dos, no falla, en el momento que le das a submit, encuentras el paper en
> cuestión:
>
> http://developer.nvidia.com/docs/IO/8230/GDC2003_OpenGLShaderTricks.pdf
>
> Estos son los slides que comentaba en el otro email :)

Vaya, tiene pinta de ser exactamente lo que está haciendo esta gente :)

Mil gracias por los 2 links!

Y sí, la parte que preguntaba yo, ahi comentan que hay que hacer el
skinning 2 veces por cada frame, una para el frame actual, y otra para
el anterior. Asi que supongo que en el killzone lo estarán pasando
como atributos per-vertex, calculados con los SPUs. Vamos, es lo más
lógico, creo yo.

De todas formas, el sistema es más complicado de lo que yo pensaba.
Alucino con que hayan conseguido que eso tire a 30 fps en una PS3, con
la complejidad que tienen las escenas de ese juego :O

Muchas gracias por los links, y gracias también a los demás por las
sugerencias :)

Hasta luegoo

Reply all
Reply to author
Forward
0 new messages