Comment créer un horizon?

8

J'ai ajouté un ciel à mon raytracer qui est échantillonné lorsqu'un rayon manque complètement un objet.

lapin

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?

bobobobo
la source
Je suis d'accord que cela semble nettement contre nature. BTW comment votre caméra va-t-elle fonctionner? Avez-vous besoin d'une skybox complète ou simplement d'une toile de fond et souhaitez-vous générer le ciel en utilisant du bruit ou l'échantillonnage à partir d'une texture est-il correct? Si c'est juste une toile de fond (ala un jeu 2.5D), vous pouvez échantillonner à partir de quelque chose comme ceci images.bibliocad.com/library/image/00010000/9000/… qui pourrait être carrelé est son panoramique.
ClassicThunder
2
Une sorte de transformation vers la coordonnée Y (ou Z, si c'est votre coordonnée "vers le haut") pourrait faire quelque chose. Par exemple, y '= 1 - (1 - y) ^ 2. L'idée étant de compresser la coordonnée Y autour de y = 0, et de la garder la même ou de la développer près de y = 1.
John Calsbeek
@Calsbeek, ce serait une excellente réponse! :)
Maik Semder

Réponses:

7

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:

entrez la description de l'image ici

Ensuite, sur votre code, je recommanderais de créer une CubeMapclasse 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 Textureencore 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 .

David Gouveia
la source
Cette réponse contourne le problème - je veux savoir comment faire apparaître la texture que j'ai générée comme le dôme du ciel terrestre .
bobobobo
2

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).

Boojum
la source