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/
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
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