Necesito ayuda con sombreado / iluminación 3d

8

¿Cómo manejan ustedes el sombreado en un juego en 3D? Tengo una fuente de luz direccional que da sombra a un lado de un árbol hecho de cubos. Los 3 lados restantes tienen solo sombreado ambiental. Por lo tanto, el efecto 3D se pierde al mirar dos lados sombreados ambientales. ¿Me estoy perdiendo de algo? ¿Debería sombrear el lado más alejado de la fuente de luz aún más oscuro? Intenté mirar Fallout 3 y parece que esto es lo que hacen, sin embargo, Minecraft parece sombrear un montículo de hierba con dos lados opuestos de luz y los dos lados opuestos oscuros dan el efecto de que hay dos luces direccionales para las dos luces lados sombreados y luz ambiental para los lados sombreados oscuros.

Javier
fuente

Respuestas:

5

Su problema es que su luz ambiental es un color constante. En realidad, la luz ambiental tiende a ser brillante desde la parte superior y oscura desde la parte inferior, porque la luz generalmente proviene de arriba.

Hay mucho que puedes hacer para arreglar esto. Como mínimo, debe tener un "color ambiental superior", "color ambiental inferior" y constantes del sombreador de vértices "dirección ambiental superior".

En su sombreador de vértices, tome el producto de punto de la "dirección ambiental superior" y el vértice normal, y use el resultado para alternar entre el "color ambiental superior" y el "color ambiental inferior:"

float value = dot( vertex_normal, top_ambient_direction ) * 0.5 + 0.5;
ambient_color = lerp( bottom_ambient_color, top_ambient_color, value );

Esa es una de las formas más simples de hacer que el ambiente se vea mejor, y se usaba a menudo en los juegos de PS2 y XBOX1. Los juegos contemporáneos van más allá al usar un "mapa de cubo ambiental" o "coeficientes armónicos esféricos ambientales".

bmcnett
fuente
3

Este es un tema complejo, y apenas estoy calificado para hablar sobre él, pero lo intentaré. Muchos juegos usan un mapa de luz precocido que tiene en cuenta la luz que rebota en múltiples superficies, luego combina eso con iluminación dinámica para producir un entorno rápido, realista y atractivo. Probablemente hay juegos modernos que hacen un ligero rebote en tiempo real.

Algo a tener en cuenta es que la luz se atenúa con la distancia; Si su lámpara está en ángulo con respecto a una superficie, el borde más cercano será más brillante que el borde más alejado. Las cosas tienden a parecer muy falsas si una lámpara brilla sobre ellas directamente en lugar de en ángulo.

La iluminación de Minecraft es especial, porque utiliza un sistema extraño donde la luz se trata casi como el calor que se difunde por todo el mundo: http://www.minecraftwiki.net/wiki/Light No se extiende fácilmente a una solución de uso general.

El efecto más atractivo que he visto usado se llama oclusión ambiental. Es costoso y generalmente solo se usa en una solución precocida, pero tiene en cuenta cómo los rincones de la habitación son más oscuros porque las paredes ocluyen la luz ambiental; el centro de la pared tiene un hemisferio de luz que lo golpea, mientras que la esquina donde se unen tres superficies solo tiene el valor de luz de una hemidamisemisfera (1/8 de esfera). https://secure.wikimedia.org/wikipedia/en/wiki/Ambient_occlusion

Hay toneladas y toneladas de escritos sobre sistemas de iluminación; buscar alrededor probablemente te servirá bien.

Gregory Avery-Weir
fuente
0

La iluminación / sombreado debe ser más avanzada que una simple decisión binaria. Los bloques no se iluminan ni se iluminan completamente con una luz, se pueden iluminar parcialmente. A veces, la cara debe ser totalmente brillante, en cuyo caso está siendo golpeada directamente por la luz. A veces solo desea la luz ambiental, si la luz no la toca por completo. Sin embargo, cuando está parcialmente oscurecido, debe darle un valor de luz entre totalmente iluminado y totalmente apagado.

El método de iluminación básico estándar cambia de luz cero a luz máxima en función de la diferencia de ángulo entre el rayo de luz entrante y la superficie normal de la cara que está iluminando.

Si la normalidad de la superficie es igual (u opuesta, dependiendo de cómo la esté mirando), entonces tiene el brillo máximo. A medida que aumenta el ángulo entre la luz entrante y la superficie normal, obtiene cada vez menos luz en esa cara de esa luz.

De esta manera, con dos luces, cada cara debe recibir un brillo que es una combinación de cuánto brillo pone cada luz en cada cara en función de su ángulo.

Esto debería ser mucho más natural que tratar de determinar si una sola cara está iluminada o no. Tendrá un gradiente natural a medida que las superficies se alejen de la luz, y obtendrá el equilibrio para las superficies afectadas por más de una luz.

SpacePrez
fuente