Agregué un cielo a mi trazador de rayos que se muestrea cuando un rayo pierde por completo cualquier objeto.
Lo que estoy haciendo aquí es que si un rayo pierde completamente algo en la escena, devuelve la función de ruido Perlin en (ray.direction.x, ray.direction.y, ray.direction.z), en otras palabras, "muestra una esfera alrededor del origen ".
Pero "se ve mal" (porque el cielo parece estar frente a usted).
¿Cómo puedo mejorar el cielo y hacer que se parezca más al horizonte de la Tierra?
¿O es más o menos así, y simplemente debería agregar más geometría en el piso?
sky
perlin-noise
bobobobo
fuente
fuente
Respuestas:
Alternativamente, podría usar un mapa de cubo con una textura de cielo en lugar de usar ruido perlin. Y también creo que hará que su escena se vea mejor debido a que tiene más detalles y variaciones en el mapeo del entorno. Eso es exactamente lo que hice cuando implementé mi raytracer.
Otra razón por la que recomiendo esto es que el entorno no necesita ser solo nubes. Puede tener montañas, puede ser una escena interior, puede ser una escena de Marte. Usando un mapa de cubos, lo único que debe hacer es intercambiar la textura y listo.
Entonces, el primer paso será encontrar un mapa de cubos que se ajuste a sus necesidades. Podría almacenarse como seis texturas separadas, o como una textura única como la que se muestra a continuación. Consulte también este enlace para obtener más información sobre cómo crear el suyo propio:
Luego, en su código, recomendaría crear una
CubeMap
clase para encapsular los cálculos de muestreo. Esta clase debería saber cómo cargar la textura del mapa de cubos y, dado un rayo , debería poder saber en qué cara y en qué posición tomar muestras. En mi implementación, encontré que era más fácil almacenar cada una de las seis caras en objetos de textura separados y ramificar según la dirección del rayo:En caso de que aún no tenga una
Texture
clase, simplemente cree la suya. Puede ser tan simple como una matriz bidimensional de colores. Entonces, solo como referencia, y sin garantía sobre la eficiencia o solidez de esta implementación, aquí está el código que usé en mi proyecto: CubeMap y CubeFace .fuente
Puede intentar usar Perlin 2D con (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Proyecta el vector de dirección en el plano Z = 1. Debería darte el efecto de un cielo infinito (plano).
fuente
Es posible que desee consultar el artículo de Iñigo Quilez (iq) Dynamic Clouds : parece algo que podría encajar en su boleto.
fuente