Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Zaelsius en 06 de Junio de 2004, 04:24:27 PM

Título: Efecto Ninja Metal Gear Solid
Publicado por: Zaelsius en 06 de Junio de 2004, 04:24:27 PM
 Hace poco estuve jugando al Metal Gear Solid de PlayStation. No lo pude jugar en su momento, pero ahora que he tenido la oportunidad puedo decir que es una pasada, sobre todo teniendo en cuenta las limitaciones técnicas de la plataforma.

Me llamó la atención el efecto de invisibilidad del robot ninja que aparece en el juego, y por eso he implementado un efecto similar en OpenGL.

Yo soy pro-DirectX (twist)  pero era más fácil y rápido usar el tutorial OpenGL de animación MD2 de Game Tutorials y modificarlo a mi gusto.

Teneis el cutre-efecto en este enlace

La idea es esta:
Citar
- Dibujar escena
- Dibujar modelos a los que queramos aplicar el efecto sólo en stencil buffer,   sin texturizar.
- Volver a dibujar escena con test de stencil, con la cámara desplazada.
- Volcar backbuffer.

Ahora un pseudo-código del bucle principal de la demo OpenGL:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// Dibujar la escena con desplazamiento 0
RenderScene(0);

// Ahora escribir sólo en stencil!
glDisable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

// Dibujar modelos con efecto fantasma
RenderGhostModels();

// Dibujar escena de nuevo con test de stencil
glDisable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 1, 0xffffffff);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

// Dibujamos la escena con un desplazamiento horizontal de 5 unidades,
// lo que crea el efecto de distorsión donde se han dibujado los modelos
RenderBackground(5);

glDisable(GL_STENCIL_TEST);
glEnable(GL_DEPTH_TEST);

// Volcar el back-buffer
SwapBuffers(g_hDC);


No cuelgo los fuentes porque sinceramente no me parecen recomendables XD. Como he dicho antes no se tarda nada en coger los fuentes del tuto de MD2 y añadir el efecto.


Todo esto es muy bonito.. es sencillo programarlo. Pero integrar este efecto en el sistema de render y materiales de un motor es más complicado. ¿Qué pensais al respecto? ¿Cómo os lo montariais?

Fight!  (uoh)

PD: El efecto concreto del MGS creo que era igual pero con 2 o 3 pasadas más, aunque creo que en algunos momentos sólo hacia 1(como yo), dependiendo de la escena.

Edit: se me olvidó comentar que la demo pesa sólo 500kb y que con el botón izquierdo y derecho del ratón se cambian algunos parámetros.
Título: Efecto Ninja Metal Gear Solid
Publicado por: donald en 06 de Junio de 2004, 05:01:17 PM
 Yo prefiero el md3, pero sin tags ni cortado a trozos..como un md2 pero sin los problemas del md2. Y aún mejor el x con sus bones. Pero para el efecto, seguro que va q chuta... :)

Título: Efecto Ninja Metal Gear Solid
Publicado por: donald en 06 de Junio de 2004, 05:04:54 PM
 estás haciendo un juego de artes marciales ?  (uoh)

(veo que a todos nos flipa ese smiley.. ;) )

(ole)  
Título: Efecto Ninja Metal Gear Solid
Publicado por: Zaelsius en 06 de Junio de 2004, 05:57:36 PM
Cita de: "donald"estás haciendo un juego de artes marciales ?  (uoh)
No, sólo he utilizado el modelo md2 que venia con el tutorial y un fondo sacado del SDK de DirectX  :P  
Título: Efecto Ninja Metal Gear Solid
Publicado por: BeRSeRKeR en 06 de Junio de 2004, 09:57:13 PM
 Lo ideal ahora que se puede hacer, es hacer el modelo transparente con un cierto grado de refracción. Eso remarcaría aún más el efecto de invisibilidad. Sin duda le daría un toque más realista ya que distorsionaría la zona que estuviera detrás del modelo. :P

Saludos.
Título: Efecto Ninja Metal Gear Solid
Publicado por: Zaelsius en 06 de Junio de 2004, 11:29:15 PM
 Es una buena idea, supongo que con alto índice de transparencia daria buenos resultados

Ahora que pienso, el código de arriba tiene un pequeño fallo. A la hora de pintar el modelo tendría que dejar activado el depth-test, porque podría darse el caso de que una parte de la escena lo tapase.
Título: Efecto Ninja Metal Gear Solid
Publicado por: Thenend en 06 de Junio de 2004, 11:32:20 PM
 Incluso podrías cambiar el FOV para que quedara un poco aumentado como si hiciera de lupa. Muy chulo el efecto, y sin pixel shaders  (ole)

Bueno, felicidades por los 21 ZaelSiuS. Y recuerda... "The best is yet to come"  ;)
Título: Efecto Ninja Metal Gear Solid
Publicado por: BeRSeRKeR en 07 de Junio de 2004, 12:29:28 AM
 Por cierto, quake3, para la invisibilidad aplicaba un shader que consistía en una o dos pasadas. Ahora no lo recuerdo bien y no lo tengo instalado para echarle un vistazo. Pero vamos, creo que era una textura con canal alpha y environment mapping. Eso digamos que simulaba la deformación del entorno aunque evidentemente no se trataba del entorno real. Quedaba bastante bien.

Si se aplicase ese efecto de environment mapping al efecto que has hecho tú, podría quedar bien.

Y bueno, yo creo que a las alturas que estamos se podría empezar a utilizar los pixel shaders sin temor alguno. Al fin y al cabo, el efecto del que hablo se puede hacer en una aceleradora con soporte para ps 1.1.

Saludos.
Título: Efecto Ninja Metal Gear Solid
Publicado por: ethernet en 12 de Junio de 2004, 12:30:59 AM
 que n tendra el indice de refraccion del ninja ? ;P
Título: Efecto Ninja Metal Gear Solid
Publicado por: BeRSeRKeR en 12 de Junio de 2004, 12:46:29 AM
 Pues no se...

El IOR del agua a 20ºC es de 1,33. Ese podría estar bien. El de diamante es 2,417 pero me parece algo heavy. :lol:

Saludos.
Título: Efecto Ninja Metal Gear Solid
Publicado por: ethernet en 12 de Junio de 2004, 10:32:10 AM
 normalmente el indice de refraccion de un medio es variable con la posicion y con la frecuencia y potencia de la onda electromagnetica que se le aplica.

no se a q efecto os referis, si alguno encuentra un shot que me pegue la url.
Título: Efecto Ninja Metal Gear Solid
Publicado por: ethernet en 12 de Junio de 2004, 11:07:36 AM
 creo q en el sdk de opengl de nvidia venia un efecto con register combiners de un conejo dentro de un edificio historico que hacia algo similar. Yo hice un efecto asi hace un tiempo muy similar a como dice berserker. me generaba una texturas procedural variando el alpha y despues con environment mapping la aplicaba. no quedaba muy mal :P