PDA

Ver la versión completa : Crear efecto niebla



anibarro
26/04/2005, 12:13
Buenas, me he quedado sin ideas para idear una función que haga efecto niebla y buscando en el google no he encontrado ninguna función, más que nada porque no se q palabras poner a buscar (fog algorithm, algoritmo niebla...)...
Weno el caso es que, teniendo la distancia a la que esta en el mundo 3D cada pixel de la pantalla, quiero cambiar su color (trabajando en 16bits) para conseguir un efecto niebla a ser posible de tipo exponencial y eligiendo el color de la niebla.
De momento tengo esto:


if( ((y_distance)>>23) > niebla.r) // para q no me oscurezca los pixels mas cercanos
niebla.r=((niebla.r+((y_distance)>>23))>>1); //rojo=(rojo+distancia)/2
if( ((y_distance)>>23) > niebla.g)
niebla.g=((niebla.g+((y_distance)>>23))>>1);
if( ((y_distance)>>23) > niebla.b)
niebla.b=((niebla.b+((y_distance)>>23))>>1);

if (niebla.r>31) niebla.r=31;//asegurarme de q ninguno se sale del rango
if (niebla.g>31) niebla.g=31;
if (niebla.b>31) niebla.b=31;

y_distance es un numero enormisimo que viene de unas tablas y tal, que desplazado 23 bits a la derecha tiene un rango de 0 a 60, asegurandome que la media del punto mas lejano sea 31 (blanco del todo).
Y ahora lo que quiero es una formula que me permita ir acercando los valores de un pixel, r, g, b, a otros que yo le de, en función de la distancia y de forma exponencial a ser posible.
Es decir, si un pixel en la pantalla es verdoso r=4, g=30, b=10 y mi color de niebla es rojo r=31, g=0, b=0, ir transformando el color del pixel al color de la niebla en función de la distancia de forma proporcional o exponencialmente que seria lo ideal, ¿a alguien se le ocurre como? pq yo ya estoy falto de ideas :shock:
gracias ;)

bitrider
26/04/2005, 13:30
De forma proporcional...

para cada componente de color

componente_final+=((componente_niebla-componente_pixel)*(y_distancia>>23))/60

AOJ
26/04/2005, 14:32
No voy a pensar mucho, que estoy un poco rallado de clases; así que voy a intentar explicarlo con palabras (mi idea, que no sé si es buena) :

Haz que los píxels a una distancia x del punto de vista, sean cada vez más claros según su lejanía (en el caso de niebla blanca, cada vez más oscuros en niebla nocturna). Entonces, delimitas la distancia máxima de visión y, en que los píxels van a ser de color completamente blanco (si lo que se quiere es conseguir tapar el efecto de popping de polígonos). Entre x e y haces el degradado progresivo de claridad/oscuridad, y listo :)

Ojo, me lo acabo de inventar, a lo mejor da resultados insatisfactorios. Pero supongo que para hacer niebla se puede usar el principio de iluminación atenuada o similar

Cuando vuelva a casa, lo miraré en mis apuntes de gráficos, a ver que tal la fórmula que nos dieron :)

theNestruo
26/04/2005, 14:38
En el redbook de OpenGL (disponible para descarga aquí (http://opengl.org/documentation/red_book_1.0/)) vienen las ecuaciones usadas por esta biblioteca para el cálculo de la niebla; concretamente en el capítulo 7, página 155 (si aún está la misma versión que tengo yo).

anibarro
26/04/2005, 17:44
bitrider va perfecta tu ecuacion muchas gracias, lo unico malo es q el rango de 0 a 60 q puse, no es muy exacto y tendré que mirar como saber el rango ^^
Nestruo impresionante ese libro :O no era esa pagina pero en la 189 lo explican de cine, me va a ser muyyy util que dios te lo pague XD
Al final lo haré lineal pq empezando a cierta distancia casi no se nota la diferencia con la exponencial y va más rápido :)
AOJ esa idea es justo la que tengo puesta en el post pero gracias
Pues ya esta hecho la variación del detalle en función de la distancia, la niebla y ahora a por la interpolación, a ver si no pierdo toda la velocidad q he ganao con lo del detalle xDD

bitrider
26/04/2005, 23:04
de nada ;-)