Ashenfall SF | Devlog

Kaptan Yosun

Co-Co Admin
Moderatör
Geliştirici
Yardımsever Üye
Usta Üye
Mesaj
1.599
Çözümler
57
Beğeni
3.238
Puan
1.839
Ticaret Puanı
0

Ashenfall SF
intro.webp

Hobi projem artık içime sinen bir hale geldiği için bu günlüğü açıyorum. Henüz gölgeler hariç bir görsel değişime gitmedim.

Temel özeliikler
Taban:
Genişlet Daralt Kopyala
* Mainline
* Visual Studio 2026
* Windows Server
* World Editor
* Tüm projeler 0 warning derlenir (Gizleme değil, tamamı düzeltildi)

Client Özellikleri
Client:
Genişlet Daralt Kopyala
* DirectX 11
* GPU Skinning
* 4 Kaskatlı CSM(Cascaded Shadow Mapping) Sistemi
* DirectXMath (https://github.com/microsoft/directxmath)
* Reverse-Z Floating Point Depth
* Screen-Space Dithered Occlusion Dissolve

:mmt-resimler:

4 Kaskatlı CSM(Cascaded Shadow Mapping) Sistemi

Screen-Space Dithered Occlusion Dissolve

World Editor (DirectX 11)

WorldEditor.webp


Güncellemelerde görüşmek üzere
 
Son düzenleme:
Bina ve ağaç gölgeleri bu kadar net olunca gerçeklikten uzakmış gibi geliyor belki de öyle değildir kişisel bir yorum, başarılar.
 
Bina ve ağaç gölgeleri bu kadar net olunca gerçeklikten uzakmış gibi geliyor belki de öyle değildir kişisel bir yorum, başarılar.
Görüşün için teşekkürler, hissettiğin şey normal. Şu anki aşamada gölgelerin çözünürlüğü çok arttığı ve kenar filtrelemesi sabit bir yumuşatma uyguladığı için, ağaç tepesi gibi yüksek nesnelerin gölgeleri de zemine çok yakınmış gibi keskin düşüyor.
Bir sonraki optimizasyon ve cila aşamasında mesafeye bağlı yumuşatma ekleyerek gölgelerin doğal bir geçişe kavuşmasını sağlayacağım
 
Eski Metod (Uniform PCF)
shadow_uniformPCF.webp


Yeni Metod (Directional PCSS with Cascade-Gating)
Shadow_PCSS.webp

[Devlog] DirectX 11 Dinamik Gölge İyileştirmesi: Directional PCSS (Percentage-Closer Soft Shadows) & Contact Hardening

Ashenfall grafik hattında gölge gerçekçiliğini artırmak ve klasik CSM (Cascaded Shadow Maps) kurulumlarındaki yapay "karton gibi keskin" gölge görünümünü tamamen ortadan kaldırmak adına gölge filtreleme mimarisini baştan aşağı yeniledim.

Gölge hattına modern AAA motorların kullandığı hibrit bir Directional PCSS (Percentage-Closer Soft Shadows) ve IGN (Interleaved Gradient Noise) rotasyonlu Poisson filtreleme sistemi entegre ettim.

Geleneksel Gölgeler vs. PCSS Nedir?Klasik motorlarda (ve projenin eski gölge sisteminde) sabit bir filtre yarıçapı kullanılır; bu yüzden metrelerce yukarıdaki ağaç yaprağının gölgesi ile karakterin toprağa basan ayağının gölgesi tamamen aynı keskinlikte çizilir. Gerçek dünyada ise ışık kaynağının (güneşin) açısal çapından dolayı, nesne gölgenin düştüğü zeminden uzaklaştıkça gölgenin sınırları flulaşır (penumbra etkisi).

Görselde Neler Değişti? (Nereye Bakmalısınız?)
  • Ağaç Gövdesi ve Canopisi: Ağacın toprağa yakın olan kütük gölgesinin ne kadar keskin başladığına, yukarıdaki dallara ve yapraklara doğru çıktıkça zemine düşen gölgenin nasıl pürüzsüz ve kademeli bir şekilde dağılarak yumuşadığına dikkat edin.
  • Binek Temas Noktaları: Karakterin ve bineğin ayak diplerinde gölge kopması (peter-panning) yaşanmıyor; temas noktaları doğrudan yere oturuyor.
  • Yüksek Mimari Yapılar: Sağ taraftaki binanın çatısının yüksekte kalan saçak gölgeleri doğal bir yayılımla yumuşarken, alçak kısımlar netliğini koruyor.
Performans & Optimizasyon:Bu hesaplama GPU'da kontrolsüz çalıştırıldığında ağır bir blocker-search maliyeti doğurur. Bunu engellemek için mimariyi Cascade-Gating ile kurguladım:

  • Fiziksel penumbra hesaplaması yalnızca gözün detayları seçebildiği ilk iki kademede (Cascade 0 ve 1) tam blocker taramasıyla çalışıyor.
  • Uzak mesafeler (Cascade 2 ve 3) otomatik olarak donanım seviyesinde optimize edilmiş standart filtrelemeye düşüyor.
  • Doğrudan güneş alan açık alanlar için erken çıkış (early-out) optimizasyonu eklediğimden, gölge almayan bölgelerde doku okuma maliyetini yarı yarıya düşürdüm.
 
Son düzenleme:
1789119940337.webp

[Devlog] DirectX 11 Kamera Görüş & Engel Çözümü: Screen-Space Dithered Occlusion Dissolve
Ashenfall grafik hattında, kamerayla karakter arasına giren devasa mimari yapıların, binaların ve ağaçların görüşü kapatmasını engellemek adına kullanılan eski nesil PCBlocker sistemini tamamen motor dışına ittim. Yerine modern AAA oyunların (Unreal Engine 5 Dither Temporal AA, Guild Wars 2, modern ARPG'ler) kullandığı ekran uzayı tabanlı Screen-Space Dithered Occlusion Dissolve mimarisini entegre ettim.
Eski PCBlocker Neydi ve Neden Değişti?
Eski sistem, 2000'lerin başından kalma saf bir CPU hamallığıydı. Her karede kamera ile karakter arasına 4'lü dinamik küre zincirleri yerleştirip sahnede octree arayışına giriyor, engelleri topluyor, CPU'da sıralıyor ve önüne çıkan koskoca bir binayı zorla alpha_blend moduna sokarak ikinci bir geçişte (pass) çiziyordu.
Bu yaklaşımın oyuna iki büyük zararı vardı:
  • İç Mekan / Alpha-Sorting Patlaması: Şeffaf hale getirilen opak modellerin Z-Buffer sıralaması bozulduğu için, binanın dışından baktığınızda çatının altı, ters yüzeyler ve evin içi dışına çıkmış gibi görünüyordu (bunu gizlemek için eklenen depthBias = -20 gibi yamalar da cabasıydı).
  • Bütünsel Kaybolma: Binanın minicik bir köşesi kameraya değse bile koskoca yapı bir hayalet gibi komple silikleşiyordu.
Yeni Sistem Nasıl Çalışıyor? (Görselde Neler Değişti?)
  • Parçacık/Piksel Seviyesinde Delinebilirlik: Artık binanın tamamı şeffaflaşmıyor. Kamera ile oyuncu arasında matematiksel bir 3D kapsül tanımlanıyor. Sadece görüş hattını fiziksel olarak kesen pikseller, ekran uzayında $8\times 8$ Bayer matrisi eşliğiyle dither edilerek (clip()) eritiliyor. Binanın geri kalan %90'lık gövdesi tamamen katı, gölgeli ve opak kalıyor.
  • Ters Yüzeyler Asla Görünmüyor: Sistem klasik şeffaflık (alpha blend) yerine standart opak çizim hattında çalıştığı için derinlik tamponu (Z-write) korunuyor. Binanın çatısının altını veya iç odalarını asla görmüyorsunuz; nesneler kendi kendini kusursuz şekilde kapatmaya devam ediyor.
  • Binek ve Karakter Muafiyeti: Yerel oyuncu ve bindiği binek çizilirken özel bir işlem hattı muafiyeti devreye giriyor. Bir duvara sıfır yanaşsanız bile bineğinizin kafası veya gövdesi kapsülün içine girip delinmiyor; çevre açılırken binek net ve kusursuz kalıyor.
  • Gölge Bütünlüğü: Nesnenin kamera önünde dither ile erimesi, sadece ana ekrandaki görüş için geçerli. Işık kamerasının derinlik geçişlerinde bu kod devre dışı bırakıldığı için, binanın yere düşürdüğü gölgede hiçbir delinme veya yırtılma yaşanmıyor.
Performans & Optimizasyon:
Eski sistemin 33 dosyaya yayılmış yüzlerce satırlık CPU octree aramaları, dynamic_cast döngüleri ve $O(n^2)$ arama yapan algoritmaları tamamen silindi.
  • Sıfır CPU Yükü: Kamera ve oyuncunun dünya pozisyonu tek bir sabit tampon (cbuffer) üzerinden GPU'ya paslanıyor; CPU tarafında tek bir raycast veya küre çakışma testi dahi koşturulmuyor.
  • GPU Erken Çıkışı (Branch Coherency): Kapsülün dışında kalan ekranın büyük çoğunluğunda algoritma daha ilk skaler karşılaştırmada erken çıkış yapıyor. Kapsülün içine düşüp clip() edilen pikseller ise arkasından gelecek ağır ışık ve gölge hesaplamalarına hiç girmeden donanım seviyesinde atıldığı için kart üzerinde ölçülemeyecek kadar nötr bir maliyetle (~0.02 ms) çalışıyor.
 
[Devlog] DirectX 11 Kamera Görüş & Engel Çözümü: Screen-Space Dithered Occlusion Dissolve
Ashenfall grafik hattında, kamerayla karakter arasına giren devasa mimari yapıların, binaların ve ağaçların görüşü kapatmasını engellemek adına kullanılan eski nesil PCBlocker sistemini tamamen motor dışına ittim. Yerine modern AAA oyunların (Unreal Engine 5 Dither Temporal AA, Guild Wars 2, modern ARPG'ler) kullandığı ekran uzayı tabanlı Screen-Space Dithered Occlusion Dissolve mimarisini entegre ettim.
Eski PCBlocker Neydi ve Neden Değişti?
Eski sistem, 2000'lerin başından kalma saf bir CPU hamallığıydı. Her karede kamera ile karakter arasına 4'lü dinamik küre zincirleri yerleştirip sahnede octree arayışına giriyor, engelleri topluyor, CPU'da sıralıyor ve önüne çıkan koskoca bir binayı zorla alpha_blend moduna sokarak ikinci bir geçişte (pass) çiziyordu.
Bu yaklaşımın oyuna iki büyük zararı vardı:
  • İç Mekan / Alpha-Sorting Patlaması: Şeffaf hale getirilen opak modellerin Z-Buffer sıralaması bozulduğu için, binanın dışından baktığınızda çatının altı, ters yüzeyler ve evin içi dışına çıkmış gibi görünüyordu (bunu gizlemek için eklenen depthBias = -20 gibi yamalar da cabasıydı).
  • Bütünsel Kaybolma: Binanın minicik bir köşesi kameraya değse bile koskoca yapı bir hayalet gibi komple silikleşiyordu.
Yeni Sistem Nasıl Çalışıyor? (Görselde Neler Değişti?)
  • Parçacık/Piksel Seviyesinde Delinebilirlik: Artık binanın tamamı şeffaflaşmıyor. Kamera ile oyuncu arasında matematiksel bir 3D kapsül tanımlanıyor. Sadece görüş hattını fiziksel olarak kesen pikseller, ekran uzayında $8\times 8$ Bayer matrisi eşliğiyle dither edilerek (clip()) eritiliyor. Binanın geri kalan %90'lık gövdesi tamamen katı, gölgeli ve opak kalıyor.
  • Ters Yüzeyler Asla Görünmüyor: Sistem klasik şeffaflık (alpha blend) yerine standart opak çizim hattında çalıştığı için derinlik tamponu (Z-write) korunuyor. Binanın çatısının altını veya iç odalarını asla görmüyorsunuz; nesneler kendi kendini kusursuz şekilde kapatmaya devam ediyor.
  • Binek ve Karakter Muafiyeti: Yerel oyuncu ve bindiği binek çizilirken özel bir işlem hattı muafiyeti devreye giriyor. Bir duvara sıfır yanaşsanız bile bineğinizin kafası veya gövdesi kapsülün içine girip delinmiyor; çevre açılırken binek net ve kusursuz kalıyor.
  • Gölge Bütünlüğü: Nesnenin kamera önünde dither ile erimesi, sadece ana ekrandaki görüş için geçerli. Işık kamerasının derinlik geçişlerinde bu kod devre dışı bırakıldığı için, binanın yere düşürdüğü gölgede hiçbir delinme veya yırtılma yaşanmıyor.
Performans & Optimizasyon:
Eski sistemin 33 dosyaya yayılmış yüzlerce satırlık CPU octree aramaları, dynamic_cast döngüleri ve $O(n^2)$ arama yapan algoritmaları tamamen silindi.
  • Sıfır CPU Yükü: Kamera ve oyuncunun dünya pozisyonu tek bir sabit tampon (cbuffer) üzerinden GPU'ya paslanıyor; CPU tarafında tek bir raycast veya küre çakışma testi dahi koşturulmuyor.
  • GPU Erken Çıkışı (Branch Coherency): Kapsülün dışında kalan ekranın büyük çoğunluğunda algoritma daha ilk skaler karşılaştırmada erken çıkış yapıyor. Kapsülün içine düşüp clip() edilen pikseller ise arkasından gelecek ağır ışık ve gölge hesaplamalarına hiç girmeden donanım seviyesinde atıldığı için kart üzerinde ölçülemeyecek kadar nötr bir maliyetle (~0.02 ms) çalışıyor.
Güzel düşünmüşsün adaşım bende PCBlocker'ı tamamen kaldırdım :D keşke erken yapsaydın fikirsiz kalmıştım :/
 
Eyv agam ben sana bunu veriyim sen bana tipografi motorunu nasıl takas
Adaşım motoru sana seve seve veririm ama entegre etmeden önce senin tarafta şu altyapıyı hazır etmen lazım, gerisini birlikte hızlıca hallederiz

FreeType 2 (Extern):

Extern/include içine freetype başlıklarını, Extern/library içine de freetype.lib dosyasını atıp EterLib ve UserInterface projelerine linklemen lazım. Vektörel fontları rasterize eden asıl motor bu.
UTF-8 Desteği (EterBase):

Türkçe karakterlerin ve çoklu dilin sorunsuz akması için EterBase altına utf8.h kütüphanesini koyman gerekiyor.
Shader Tarafı (text_ps.hlsl):

Yazıların cam gibi tok durması piksel shader'ındaki sRGB gama düzeltmesinden geliyor. Senin text_ps.hlsl içini şu şekilde güncellemen yeterli:
text_ps.hlsl:
Genişlet Daralt Kopyala
 sampler2D sDiffuse : register(s0);

struct PS_IN { float4 color : COLOR0; float2 uv : TEXCOORD0; };

float4 main(PS_IN input) : COLOR0 { float4 tex = tex2D(sDiffuse, input.uv); float alpha = pow(saturate(tex.a), 1.4f); // Yazıyı keskinleştiren gama formülü return float4(input.color.rgb, input.color.a * alpha); }

Pack Tarafı:
Pack içine kaliteli bir .ttf (örneğin Tahoma veya Segoe UI) koyacaksın.
Sen bu hazırlıkları yap, ben sana bendeki FontManager, GrpFontTexture ve GrpTextInstance dosyalarını göndereyim kalan ufak tefek bağlantıları da beraber hallederiz
 
Adaşım motoru sana seve seve veririm ama entegre etmeden önce senin tarafta şu altyapıyı hazır etmen lazım, gerisini birlikte hızlıca hallederiz

FreeType 2 (Extern):

Extern/include içine freetype başlıklarını, Extern/library içine de freetype.lib dosyasını atıp EterLib ve UserInterface projelerine linklemen lazım. Vektörel fontları rasterize eden asıl motor bu.
UTF-8 Desteği (EterBase):

Türkçe karakterlerin ve çoklu dilin sorunsuz akması için EterBase altına utf8.h kütüphanesini koyman gerekiyor.
Shader Tarafı (text_ps.hlsl):

Yazıların cam gibi tok durması piksel shader'ındaki sRGB gama düzeltmesinden geliyor. Senin text_ps.hlsl içini şu şekilde güncellemen yeterli:
text_ps.hlsl:
Genişlet Daralt Kopyala
 sampler2D sDiffuse : register(s0);

struct PS_IN { float4 color : COLOR0; float2 uv : TEXCOORD0; };

float4 main(PS_IN input) : COLOR0 { float4 tex = tex2D(sDiffuse, input.uv); float alpha = pow(saturate(tex.a), 1.4f); // Yazıyı keskinleştiren gama formülü return float4(input.color.rgb, input.color.a * alpha); }

Pack Tarafı:
Pack içine kaliteli bir .ttf (örneğin Tahoma veya Segoe UI) koyacaksın.
Sen bu hazırlıkları yap, ben sana bendeki FontManager, GrpFontTexture ve GrpTextInstance dosyalarını göndereyim kalan ufak tefek bağlantıları da beraber hallederiz
Şakaydı, düşünmen yeter. Ben kendim biraz uğraşmayı seviyorum. Var ol
 
Geri
Üst