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:
class CubeMap
{
public void Load(string path);
public Color GetSample(Ray ray);
private Texture[6] faces;
}
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 .