J'ai ajouté un ciel à mon raytracer qui est échantillonné lorsqu'un rayon manque complètement un objet.
Ce que je fais ici, c'est que si un rayon manque complètement quelque chose dans la scène, il renvoie la fonction de bruit Perlin à (ray.direction.x, ray.direction.y, ray.direction.z) - en d'autres termes, il "échantillonne" une sphère autour de l'origine ".
Mais ça "ne va pas" (parce que le ciel a l'air de vous faire face ).
Comment puis-je améliorer le ciel et le faire ressembler davantage à l'horizon terrestre?
Ou est-ce plus ou moins à quoi cela devrait ressembler, et je devrais simplement ajouter plus de géométrie sur le sol?
sky
perlin-noise
bobobobo
la source
la source
Réponses:
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: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 .la source
Vous pouvez essayer d'utiliser Perlin 2D avec (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Le projette le vecteur direction sur le plan Z = 1. Cela devrait vous donner l'effet d'un ciel infini (plat).
la source
Vous voudrez peut-être consulter l' article sur les nuages dynamiques d'Iñigo Quilez (iq) - Il ressemble à quelque chose qui pourrait correspondre à votre ticket.
la source