Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Efecto De Hielo, Metal Y Cristal

Iniciado por tiutiu, 07 de Marzo de 2005, 02:10:27 PM

« anterior - próximo »

tiutiu

 Tenemos que hacer un proyecto para la universidad que consiste en reproducir de la forma mas realista posible una partida de ajedrez.
Uno de los requisitos que hemos puesto es tener materiales bonitos para las piezas, p.ej. hielo, metal, cristal, madera, marmol, ... con su iluminacion y todo eso.

He pensado que para las reflexiones lo mas conveniente es usar cubemaps, pero no se si tienen mucha utilidad en materiales que no sean metalicos. ¿Le tengo que dar algun tipo de alfa o blur a la reflexion si no es metal?
Ademas el cristal y el hielo tendran que refractar, ¿como lo consigo?

A ver si me podeis orientar un poco que ando algo perdido. He leido el tutorial de nVidia sobre cubemaps, pero aun asi me quedan dudas sobre como hacerlo realista.


Saludos
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

Sacrifai

 Podias echar un ojo al codigo de pov-ray, a lo mejor te ayuda a sacar algo.

Pogacha

 Si no es metal, lo que puedes usar es el modelo de Blinn, que propone una componente especular monocroma, tendrias que estudiar el modelo de iluminacion de Blinn o tambien llamado Pong, es bastante sencillo y se puede aplicar per vertex o per pixel. Para las cosas estilo plastico y ceramica esta tecnica es ideal.
Si la reflexion es sobre un plano (por ejemplo el tablero de ajedrez) te conviene hacer el metodo del espejo por stencil.
Para refractar no te podria recomendar otra cosa que photon-mapping (ultra avanzado) pero no termino de estudiarlo así que no se si es posible en tiempo real y para esta aplicación.
La refracción es demasiado complicada, una forma sencilla (no realista) seria una segunda pasada tomando como textura base el render actual y deformandolo segun una ecuacion matematica a travez de una malla o un pixel shader.
Saludos.

BeRSeRKeR

 Tanto para las reflexiones como las refracciones puedes utilizar cubemaps. El mismo cubemap te servirá para los dos casos.

En cuanto a cómo conseguirlo, depende. Nosotros en el motor C# utilizamos shaders 2.0. Tienes dos opciones, hacerlo per-vertex o per-pixel. En el caso de que sea per-vertex, en el vertex shader calculas el vector "reflection":

float3 incident = vertex_pos_W - camera_pos_W;
data_out.reflection = reflect(incident, normal_W);


El _W significa que los vectores están en world-space.

Después en el pixel shader haces:

float4 reflectedColor = texCUBE(enc_cube_map, data_in.reflection);
float4 baseColor = tex2D(base_map, data_in.tex_coord);
float4 finalColor = lerp(baseColor, reflectedColor, reflectivity);


aquí lo más importante para conseguir distintos tipos de material es la variable "reflectivity" que es el índice de reflectancia e indica la cantidad de luz reflejada por el objeto.

En el caso de la refracción es similar. En caso de hacerlo a nivel de vértice sería, en el vertex shader:

float3 incident = vertex_pos_W - camera_pos_W;
data_out.refraction = refract(incident, normal_W, ior);


Aquí "ior" es el índice de refracción. Por ejemplo si se trata de agua, el ior es 1.3333, en el caso del cristal es 1.5, etc.

El pixel shader sería:

float4 refractedColor = texCUBE(enc_cube_map, data_in.refraction);
float4 baseColor = tex2D(base_map, data_in.tex_coord);
float4 finalColor = lerp(baseColor, refractedColor, transmittance);


La variable "transmittance" controla la cantida de luz que transmite el material.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

tiutiu

 Gracias! Lo que pasa es que no usamos shaders. A ver si encuentro alguna manera de hacerlo sin ellos, ya que tenemos que hacer aun muchas cosas y no se si tendremos tiempo como para invertirlo en aprender a utilizar shaders.
Pero bueno, ahora ya se como va lo de reflexiones y refracciones, y sobre todo las variables que dan los distintos materiales. Gracias Bersi ;)

Pogacha, ya he mirado lo del modelo Phong para el specular y queda bastante mejor que el gouraud shading que trae el opengl.
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

tiutiu

 Weno, me han comentado que para obtener el efecto de jade, marmol, hielo o cristal tengo que usar un metodo que se llama subsurface scattering, descrito aqui. Da resultados muy realistas, pero claro, tiene que ser a tiempo real, y probablemente sin shaders (cada dia veo mas claro que tendremos que aprender a usarlos :S ).

¿Lo habeis implementado/usado alguna vez? Sino me han dicho que para una escena tan pequeña como es un tablero de ajedrez y 32 piezas puedo hacer raytracing a tiempo real y obtener buenos efectos. ¿Que opinais?
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

BeRSeRKeR

 Se puede conseguir sub-surface scattering en tiempo real utilizando spherical harmonics. Con el SDK de DX viene un ejemplo (Local Deformable PRT) donde lo hacen pero evidentemente utiliza shaders 2.0.

Creo recordar que alguna vez he visto algún shader para el render de piel en el que se emula de alguna forma sub-surface scattering y utilizaba pixel shaders 1.1 pero la verdad es que no sé si se podrá conseguir sin su utilización.

Está claro que si quieres realismo necesitas shaders 2.0 o tirar por el camino del raytracing pero hacerlo en tiempo real, aunque posible, no sé cuánto tiempo os puede suponer. Eso ya dependerá de vuestros conocimientos.

Saludos.

EDIT:

Pásate por aquí y al final del todo tienes una demo en la que se muestra la utilización de spherical harmonics para conseguir iluminación indirecta, soft shadows y sub-surface scattering. Tienes tanto el ejecutable como un video. Eso sería lo ideal para tu tablero de ajedrez. ;)
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

tiutiu

 Ufff que calidad! Eso corre en tiempo real?? Pues si que estaria bien si dispusiese del hardware necesario. De todos modos le he enviado un email al profe para que me diga las caracteristicas del pc en el que correra el proyecto, a ver si me da buenas noticias y nos podemos regalar.

Pero en el caso de que no podamos por falta de hardware, que otras opciones me quedan? me han dicho algo de subsampling pero no se que es, y sino falsearlo de alguna manera. Los gloss maps me servirian para eso? aunque no sea para el marmol o jade, quizas para hielo o cristal...

Lo del raytracer no se si podra ser, ya que conseguir 30 fps a 1024x768 creo que es una burrada incluso para la  relativamente poca geometria de la escena.  
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos






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.