Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Efecto Ninja Metal Gear Solid

Iniciado por Zaelsius, 06 de Junio de 2004, 04:24:27 PM

« anterior - próximo »

Zaelsius

 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.

donald

 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... :)

Me paso por aquí de cuando en cuando (1 vez cada 3 o 4 meses) ...así que si no respondo a algo no es por antipático. ;) Posteo, y me acuerdo del foro tres meses después... ;)    :-S

donald

 estás haciendo un juego de artes marciales ?  (uoh)

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

(ole)  
Me paso por aquí de cuando en cuando (1 vez cada 3 o 4 meses) ...así que si no respondo a algo no es por antipático. ;) Posteo, y me acuerdo del foro tres meses después... ;)    :-S

Zaelsius

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  

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Zaelsius

 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.

Thenend

 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"  ;)

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

ethernet

 que n tendra el indice de refraccion del ninja ? ;P

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

ethernet

 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.

ethernet

 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






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.