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.