Ich habe meinem Raytracer einen Himmel hinzugefügt, der abgetastet wird, wenn ein Strahl ein Objekt vollständig verfehlt.
Was ich hier mache, ist, wenn ein Strahl etwas in der Szene komplett verfehlt, gibt er die Perlin-Rauschfunktion bei (ray.direction.x, ray.direction.y, ray.direction.z) zurück - mit anderen Worten, er "tastet ab eine Kugel um den Ursprung ".
Aber es "sieht falsch aus" (weil der Himmel so aussieht, als ob er dir zugewandt ist).
Wie kann ich den Himmel verbessern und ihn dem Horizont der Erde ähnlicher machen?
Oder sollte es mehr oder weniger so aussehen und ich sollte einfach mehr Geometrie auf den Boden legen?
sky
perlin-noise
Bobobobo
quelle
quelle
Antworten:
Alternativ können Sie eine Würfelkarte mit einer Himmelstextur anstelle von Perlin-Rauschen verwenden. Und ich denke auch, dass Ihre Szene dadurch besser aussieht, da die Umgebungszuordnung detaillierter und abwechslungsreicher ist. Genau das habe ich getan, als ich meinen Raytracer implementiert habe.
Ein weiterer Grund, warum ich dies empfehle, ist, dass die Umgebung nicht nur aus Wolken bestehen muss. Es kann Berge haben, es kann eine Innenszene sein, es kann eine Szene vom Mars sein. Mit einer Würfelkarte müssen Sie nur die Textur austauschen und fertig.
Der erste Schritt besteht also darin, eine Würfelkarte zu finden, die Ihren Anforderungen entspricht. Es kann als sechs separate Texturen oder als einzelne Textur wie die folgende gespeichert werden. Auch überprüfen Sie diesen Link für weitere Informationen, wie Sie Ihre eigenen erstellen:
Dann würde ich empfehlen, für Ihren Code eine
CubeMap
Klasse zu erstellen , um die Stichprobenberechnungen zu kapseln. Diese Klasse sollte wissen, wie die Würfelkartentextur geladen wird, und mit einem Strahl sollte sie wissen können, in welchem Gesicht und an welcher Position sie abtasten soll. In meiner Implementierung fand ich es einfacher, jede der sechs Flächen in separaten Texturobjekten zu speichern und basierend auf der Richtung des Strahls zu verzweigen:Falls Sie noch keine
Texture
Klasse haben, erstellen Sie einfach Ihre eigene. Es kann so einfach sein wie eine zweidimensionale Anordnung von Farben. Nur als Referenz und ohne Garantie für die Effizienz oder Solidität dieser Implementierung, hier ist der Code, den ich für mein Projekt verwendet habe - CubeMap und CubeFace .quelle
Sie können versuchen, 2D Perlin mit (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z) zu verwenden. Das projiziert den Richtungsvektor auf die Ebene Z = 1. Es sollte Ihnen die Wirkung eines unendlichen (flachen) Himmels geben.
quelle
Vielleicht möchten Sie den Artikel über dynamische Wolken von Iñigo Quilez (iq) lesen - Es sieht nach etwas aus, das zu Ihrem Ticket passt.
quelle