Alternativement, vous pouvez utiliser une carte cubique avec une texture de ciel au lieu d'utiliser du bruit perlin. Et je pense également que cela rendra votre scène plus belle en raison de plus de détails et de variations dans la cartographie de l'environnement. C'est exactement ce que j'ai fait lorsque j'ai implémenté mon raytracer.
Une autre raison pour laquelle je recommande cela, c'est que l'environnement n'a pas besoin d'être uniquement constitué de nuages. Ça peut avoir des montagnes, ça peut être une scène d'intérieur, ça peut être une scène de mars. À l'aide d'une carte cubique, la seule chose que vous devez faire est d'échanger la texture et vous avez terminé.
La première étape sera donc de trouver une carte de cube qui correspond à vos besoins. Il peut être stocké sous forme de six textures distinctes ou sous la forme d'une seule texture comme celle ci-dessous. Consultez également ce lien pour plus d'informations sur la création du vôtre:
Ensuite, sur votre code, je recommanderais de créer une CubeMap
classe pour encapsuler les calculs d'échantillonnage. Cette classe devrait savoir comment charger la texture de la carte du cube, et étant donné un rayon, elle devrait pouvoir savoir dans quelle face et dans quelle position échantillonner. Dans mon implémentation, j'ai trouvé plus facile de stocker chacune des six faces dans des objets de texture séparés et de créer une branche en fonction de la direction du rayon:
class CubeMap
{
public void Load(string path);
public Color GetSample(Ray ray);
private Texture[6] faces;
}
Si vous n'avez pas Texture
encore de cours, créez simplement le vôtre. Cela peut être aussi simple qu'un tableau bidimensionnel de couleurs. Donc, juste comme référence, et sans aucune garantie sur l'efficacité ou la solidité de cette implémentation, voici le code que j'ai utilisé sur mon projet - CubeMap et CubeFace .