[Devlog] DirectX 11 Dinamik Atmosfer & Gökyüzü: Hillaire Modeli, Gerçek Zamanlı Efemeris & Gece/Gündüz Döngüsü
Ashenfall grafik hattında, oyunun 2000’lerin başından kalma statik "kutu gökyüzü" (skybox) devrini tamamen kapattım. Oyundaki tüm 6 yüzeyli sahte küp dokuları, harita başına hardcoded girilmiş ışık/sis ayarlarını ve arka planda dönen statik ortam kodlarını kökünden kazıyarak projeden temizledim.
Yerine, modern AAA motorların (Unreal Engine SkyAtmosphere mimarisi) temelini oluşturan
Sébastien Hillaire (EGSR 2020) fiziksel atmosfer modelini ve bilimsel gök cismi efemerislerini entegre ettim.
Eski Statik Skybox Neydi ve Neden Çöpe Gitti?
Eski sistem kamerayı takip eden basit bir 3D küp ve üzerine yapıştırılmış 6 adet .dds dokusundan ibaretti.
- Zaman Algısı Yoktu: Fotoğrafı çekilmiş saat kaçsa gökyüzü hep oydu; güneş hareket etmez, geceye geçişler sadece sahneyi yapay bir siyah/mavi renkle karartarak taklit edilirdi.
- Kopuk Zemin: Gökyüzünün aydınlığı ile yerdeki arazinin ve gölgelerin ışık açısı birbirinden tamamen bağımsızdı.
- Çiğ Sis: Uzaktaki dağlar derinlik kazanmak yerine tek ton çiğ bir renge boyanarak boğuluyordu.
Yeni Sistem Nasıl Çalışıyor? (Bilimsel Arka Plan)
Artık oyunda tek bir piksel bile boyanmış gökyüzü dokusu bulunmuyor; gökyüzü tamamen gerçek zamanlı fizik ve atmosferik saçılma simülasyonuyla matematiksel olarak anlık üretiliyor.
- %0.001 Hata Payıyla Astronomik Yörüngeler:
Güneş’in gökyüzündeki hareketi NOAA (Amerikan Ulusal Okyanus ve Atmosfer İdaresi) güneş konumu algoritmasıyla; Ay’ın konumu, topomerkezli paralaksı ve anlık evreleri (hilal, dolunay) ise Paul Schlyter astronomik efemeris formülleriyle hesaplanıyor. Saat kaçsa, Güneş ve Ay gökyüzünde milimetrik gerçek koordinatında yer alıyor.
- Fiziksel Saçılma (Rayleigh & Mie):
Atmosferimiz Dünya standartlarında 6360 km gezegen ve 60 km hava katmanı kalınlığıyla modelleniyor. Havanın moleküler yapısı mavi ışığı daha çok saçtığı için (1 / lambda^4) gökyüzü gündüz masmavi; ufukta yol uzayıp maviler tükendiğinde ise gün batımı kendiliğinden kızıla dönüyor. Güneşin etrafındaki göz alıcı hale ise Mie faz fonksiyonu (g = 0.8) ile toz ve aerosollerin ışığı öne fırlatmasıyla oluşuyor.
- Stratosferik Ozon Tabakası:
Modelde 25 km yükseklikte bir ozon katmanı simüle ediliyor. Alacakaranlıkta güneş ufkun altına indiğinde gökyüzünün çamurlu bir gri yerine büyüleyici bir gece maviliğine bürünmesini sağlayan şey, ozonun kırmızı/sarı dalga boylarını emmesidir.
- Çoklu Saçılma (Multiple Scattering):
Işığın sadece bir kere değil, atmosferde ve yeryüzünde defalarca sekerek dağların arkasındaki gölgeleri gökyüzü mavisiyle doldurması analitik bir geometrik seriyle (L_total = L_2 / (1 - f_ms)) hesaplanıyor. Gölgeler zifiri siyah kalmıyor, doğal bir ortam ışığıyla (ambient fill) nefes alıyor.
- Kusursuz Radyometrik Toplam (Radyans Eşitliği):
Sabah güneş doğarken gökyüzünün aniden siyaha düşmesini engellemek için radyometri kurallarına (L_total = L_sun + L_moon) sadık kaldım. Güneş doğarken tepedeki ay ışığı kesilip atılmıyor; iki gök cisminin yaydığı fotonlar atmosferde toplanarak gün doğumunu sıfır görsel sıçramayla devrediyor.
Videoda Neler Değişti? (Nereye Bakmalısınız?)
- Uzak Dağlar ve Hava Perspektifi (Aerial Perspective):
Eski yapay mesafe sisi tamamen kalktı. Dağlar ile kamera arasındaki yüzlerce metrelik havanın kalınlığı derinlik tamponundan (Depth) taranarak fiziksel olarak araya giriyor; uzaktaki tepeler gerçek dünyadaki gibi atmosferik pusa gömülüyor.
- Güneş Diski ve Ufuk Kızıllığı:
Güneş gökyüzünde boyalı bir resim değil, açısal çapı (0.5 derece) doğrultusunda analitik olarak parıldayan bir küre. Ufka yaklaştıkça ışınların geçtiği hava yolu 400 km'ye çıktığı için diskin kendisi sarıdan turuncuya ve kızıla dönerek batıyor.
- Dinamik Gölgeler ile Kusursuz Uyum:
Yönsel PCSS gölge kaskadlarımız (CSM) artık doğrudan NOAA güneş vektörüne bağlı. Gün batımında binek ve bina gölgelerinin ufka doğru dramatik şekilde uzamasını, çoklu saçılma sayesinde gölge içlerinin yumuşacık bir mavi dolgu ışığı almasını izleyebilirsiniz.
Performans & Optimizasyon:
Bu kadar ağır atmosferik integralleri 60 FPS'te ekran çözünürlüğünde koşturmak GPU'yu anında kilitlerdi. Sistemi Hillaire'in 4'lü LUT (Lookup Table) mimarisiyle sıfır darboğaz seviyesine çektim:
- Çözünürlükten Bağımsız Sabit Yük: Gökyüzü 2 milyon piksel için ayrı ayrı ray-march edilmiyor. Her kare yalnızca 192 x 108 boyutundaki küçücük bir Sky-View LUT dokusuna marş ediliyor.
- Tek Geçişte Fullscreen Triangle: Ekrana çizim aşamasında opak geometrilerden hemen sonra tek bir dev üçgenle (VFMT_NONE, sıfır vertex buffer masrafı) girilip derinlik tamponu taranıyor; gökyüzü olan yerlere tablodan doğrudan doku okunarak işlem kapatılıyor.
- Önbellek Tabloları: Geçirgenlik (256 x 64) ve Çoklu Saçılma (32 x 32) tabloları sadece gezegen parametreleri değiştikçe bir defa üretiliyor; her kare sıfır maliyetle çalışıyor.
- Sistemin D3D11 üzerindeki toplam ek maliyeti 0.2 ms'nin altındadır.