Saya menambahkan langit ke raytracer saya yang menjadi sampel ketika sinar benar-benar kehilangan objek apa pun.
Apa yang saya lakukan di sini adalah jika sinar benar-benar melewatkan apa pun dalam adegan, ia mengembalikan fungsi kebisingan Perlin di (ray.direction.x, ray.direction.y, ray.direction.z) - dengan kata lain itu "sampel" sebuah bola di sekitar titik asal ".
Tapi itu "terlihat salah" (karena langit seperti itu menghadapmu ).
Bagaimana saya bisa memperbaiki langit dan membuatnya lebih seperti cakrawala bumi?
Atau apakah ini kurang lebih seperti apa bentuknya, dan saya hanya perlu menambahkan lebih banyak geometri di lantai?
sky
perlin-noise
bobobobo
sumber
sumber
Jawaban:
Atau Anda bisa menggunakan peta kubus dengan tekstur langit daripada menggunakan perlin noise. Dan saya juga berpikir itu akan membuat pemandangan Anda terlihat lebih baik karena memiliki lebih banyak detail dan variasi dalam pemetaan lingkungan. Itulah tepatnya yang saya lakukan ketika saya mengimplementasikan raytracer saya.
Alasan lain yang saya rekomendasikan ini, adalah bahwa lingkungan tidak perlu hanya berupa awan. Bisa memiliki gunung, bisa menjadi adegan dalam ruangan, bisa menjadi adegan dari mars. Menggunakan peta kubus satu-satunya hal yang perlu Anda lakukan adalah menukar tekstur dan Anda selesai.
Jadi langkah pertama adalah menemukan peta kubus yang sesuai dengan kebutuhan Anda. Ini dapat disimpan sebagai enam tekstur terpisah, atau sebagai tekstur tunggal seperti di bawah ini. Periksa juga tautan ini untuk info lebih lanjut tentang cara membuat sendiri:
Kemudian pada kode Anda, saya sarankan membuat
CubeMap
kelas untuk merangkum perhitungan sampling. Kelas ini harus tahu cara memuat tekstur peta kubus, dan diberi ray itu harus bisa tahu di mana wajah dan dalam posisi apa untuk sampel. Dalam implementasi saya, saya menemukan lebih mudah untuk menyimpan masing-masing dari enam wajah dalam objek tekstur yang terpisah, dan bercabang berdasarkan arah sinar:Jika Anda belum memiliki
Texture
kelas, buat saja kelas Anda sendiri. Ini bisa sesederhana array warna dua dimensi. Jadi, hanya sebagai referensi, dan tanpa jaminan efisiensi atau kesehatan implementasi ini, inilah kode yang saya gunakan pada proyek saya - CubeMap dan CubeFace .sumber
Anda dapat mencoba menggunakan 2D Perlin dengan (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Memproyeksikan vektor arah ke bidang Z = 1. Seharusnya memberi Anda efek langit (datar) yang tak terbatas.
sumber
Anda mungkin ingin memeriksa artikel Dynamic Clouds Iñigo Quilez - sepertinya sesuatu yang mungkin sesuai dengan tiket Anda.
sumber