Saya sedang dalam proses mengimplementasikan hamburan planet-planet dari ruang angkasa. Saya telah menggunakan shader Sean O'Neil dari http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html sebagai titik awal.
Saya memiliki masalah yang hampir sama terkait dengan fCameraAngle kecuali dengan SkyFromSpace shader sebagai lawan dari GroundFromSpace shader seperti di sini: http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scat/
Saya mendapatkan artefak aneh dengan langit dari luar angkasa jika tidak digunakan fCameraAngle = 1
dalam lingkaran dalam. Apa penyebab artefak ini? Artefak menghilang ketika fCameraAngle dibatasi menjadi 1. Saya juga tampaknya tidak memiliki rona yang ada di kotak pasir O'Neil ( http://sponeil.net/downloads.htm )
Posisi kamera X = 0, Y = 0, Z = 500. GroundFromSpace di sebelah kiri, SkyFromSpace di sebelah kanan.
Posisi kamera X = 500, Y = 500, Z = 500. GroundFromSpace di sebelah kiri, SkyFromSpace di sebelah kanan.
Saya telah menemukan bahwa sudut kamera tampaknya ditangani sangat berbeda tergantung sumbernya:
Dalam bayangan asli, sudut kamera di SkyFromSpaceShader dihitung sebagai:
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
Sedangkan di darat dari shader ruang, sudut kamera dihitung sebagai:
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
Namun, berbagai sumber bermain-main online dengan meniadakan ray. Kenapa ini?
Berikut adalah proyek C # Windows.Forms yang menunjukkan masalah dan yang saya gunakan untuk menghasilkan gambar: https://github.com/ollipekka/AtmosphericScatteringTest/
Pembaruan: Saya telah menemukan dari proyek ScatterCPU yang ditemukan di situs O'Neil bahwa sinar kamera dinegasikan ketika kamera berada di atas titik yang diarsir sehingga hamburan dihitung dari titik ke kamera.
Mengubah arah sinar memang menghilangkan artefak, tetapi menimbulkan masalah lain seperti diilustrasikan di sini:
Selain itu, dalam proyek ScatterCPU, O'Neil menjaga terhadap situasi di mana kedalaman optik untuk cahaya kurang dari nol:
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
Seperti yang ditunjukkan dalam komentar, bersama dengan artefak baru ini masih menyisakan pertanyaan, apa yang salah dengan gambar di mana kamera diposisikan pada 500, 500, 500? Rasanya seperti halo terfokus pada bagian planet yang sepenuhnya salah. Orang akan berharap bahwa cahaya akan lebih dekat ke tempat di mana matahari seharusnya mengenai planet, daripada di mana ia berubah dari hari ke malam.
Proyek github telah diperbarui untuk mencerminkan perubahan dalam pembaruan ini.
sumber
Jawaban:
Saya tidak memiliki kode kerja sekarang, karena saya sedang mentransisikan mesin saya tetapi ini adalah pengaturan parameter kerja saya:
Ini adalah shader:
Beri tahu saya jika masih berfungsi. Jika Anda membutuhkan bantuan lain, saya akan mencoba menggali kode saya. Saya pikir saya menggunakan dua bidang untuk melakukan rendering: satu untuk permukaan dan satu untuk atmosfer.
sumber
beberapa jalur pemikiran: periksa ketepatan float Anda pada skala ruang, sebagian besar waktu float32 tidak cukup. Periksa dpeth buffer jika Anda memiliki rendering primitif, seperti bola di bawah shader hamburan Anda.
Artefak ini, dapat ditemukan dalam raytracing juga, ini biasanya persimpangan sinar sekunder dengan permukaan primer yang naik-turun karena masalah presisi apung.
EDIT: pada 1000 (semua bilangan bulat sepenuhnya mewakili hingga 16 juta dalam representasi float32, berkat mantissa 24 bit), angka berikutnya untuk float32 adalah 1000.00006103 sehingga presisi Anda masih cukup bagus pada kisaran ini.
namun jika Anda menggunakan rentang meter, untuk melihat sebuah planet jarak ini akan berarti nilai 100.000.000 dan selanjutnya adalah 100000008: 8 meter presisi pada 100.000 km.
ini akan menyebabkan kamera melompat jika Anda mencoba untuk bergerak di sekitar satelit misalnya, dan render satelit itu sendiri akan rusak semua jika nol dunia Anda adalah pusat dari planet ini. jika itu adalah pusat dari sistem bintang maka itu bahkan lebih buruk.
mencari flavien brebion (Ysaneya) dan game infinity quest untuk bumi. Dia memiliki jurnal dev yang menarik tentang gamedev dan forumnya di mana dia menjelaskan bagaimana jarak sistem bintang tidak mungkin dikelola dengan menggunakan absolut.
Dia juga menyebutkan masalah penyangga kedalaman pada rentang semacam itu, dan merupakan salah satu yang pertama, jika bukan yang pertama, untuk memperkenalkan skala z logaritmik. http://www.gamedev.net/blog/73/entry-2006307-tip-of-the-day-logarithmic-zbuffer-artifacts-fix/ yang jauh lebih lengkap di sini: http://outerra.blogspot.jp/ 2012/11 / memaksimalkan-kedalaman-buffer-range-and.html
Ranjang uji perangkat lunak: ide bagus, ini adalah cara terbaik untuk membuat shader sehingga Anda dapat men-debug apa yang terjadi langkah demi langkah. cukup periksa nilai-nilai Anda baris demi baris, dan jika ada sesuatu yang aneh Anda bisa selidiki. Saya tidak melihat dalam kode yang Anda posting bagian di mana sudut kamera digunakan dalam shader, jadi saya agak bingung tentang bagian ini.
sumber