KaptanYosun'un Shader-Driven Grafik Günlüğü

Kaptan Yosun

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

KaptanYosun'un Shader-Driven Grafik Günlüğü​

Üzerinde çalıştığım grafik sistemlerini ve bu süreçte edindiğim deneyimleri bu konuda adım adım paylaşacağım.

Şimdiye kadar yaptıklarım:​

HLSL Shader Manager.cpp/h
  • Shader derleme, yükleme ve yönetim süreçleri tek bir merkezden kontrol edilebilecek.
  • Shader'lar D3DDevice ile beraber oluşacak, cache edilecek, her map yüklemesinde yeniden derlenmeyecek, D3DDevice ile beraber yok edilecek.
ShaderVertexDeclarations.[cpp/h]
  • Kolayca ölçeklenebilir ve genişletilebilir olması için class'lara bölündü.
ShaderSettings.h
  • Shader parametrelerinin dağınık yapılardan kurtarılması amacıyla, tüm ayarların merkezi olarak yönetilebildiği bir kontrol merkezidir.
  • Kolayca ölçeklenebilir ve genişletilebilir olması amacıyla namespace'lere ve struct'lara bölündü.
YosunAdminPanel içine bir ImGui Shader Manager yazıldı.
  • Shader'a gönderilen tüm parametreler bu merkezden gerçek zamanlı kontrol edilebilir.
  • Farklı shaderlar kolay yönetim için yan yana sekmelere ayrıldı.
Screenshot 2026-01-31 161537.webp

Gelecek hedefler:​

Su verisine yükseklik (height) bilgisi eklenerek heightmap destekli bir su yüzeyi sistemi oluşturmak.
Su patch’leri başına düşen vertex yoğunluğunu artırarak, daha yüksek detaylı ve daha doğal bir su yüzeyi elde etmek.
Merkezi bir rüzgar sistemi kurup, SpeedTree ve Water shaderlarını ortak rüzgar ile etkileşime sokmak.

Bu günlük ilerledikçe; karşılaşılan problemler, alınan tasarım kararları ve yapılan optimizasyonlar da mümkün olduğunca şeffaf şekilde paylaşılacak.
 
Son düzenleme:
Su ile başlamanın doğru olacağını düşündüm.

  • MapOutdoorWater.cpp, DirectX 9 Fixed Function Pipeline (FFP) bağımlılıklarından tamamen arındırıldı.
    • Su render süreci artık tamamen vertex ve pixel shader’lar üzerinden gerçekleştiriliyor.
  • 30 adet su resmini itere edip suyu animasyonlu gibi gösterme mantığı kaldırıldı.
    • Su artık tek resim kullanıyor.
  • Suyu Z ekseninde yukarı aşağı indirip kaldırarak sahte bir sahil dalga animasyonu yapma mantığı kaldırıldı.
    • Bu çok ilkel bir yöntemdi ve göz tırmalıyordu.
  • Şimdilik prosedürel olarak sine dalgaları kullandım, henüz çok erken bir aşamadayım, heightmap mantığını oluşturana kadar bunu kullanacağım. Sadece Shader'ın çalıştığına dair bir hatırlatıcı olarak.

 
Su güncellemesi:
  • Heightmap tabanlı su yer değiştirmesi (vertex displacement) eklendi
    Su yüzeyi artık sin/cos gibi prosedürel dalgalar yerine doğrudan bir heightmap texture’dan okunarak vertex seviyesinde şekilleniyor.​
  • Vertex shader tarafında texture sampling altyapısı kuruldu
    Heightmap, SetVertexTexture ile vertex shader’a bağlandı ve DX9’un gerektirdiği şekilde tex2Dlod kullanımıyla güvenli hale getirildi.​
  • World-space UV sistemine geçildi
    Su UV’leri mesh’e veya patch çözünürlüğüne bağlı olmaktan çıkarılıp, doğrudan world position’dan türetilir hale getirildi.
    Bu sayede patch sınırlarında dikiş (seam) problemleri ortadan kalktı.​
  • World-space UV ölçekleme parametresi eklendi
    worldUVScale shader ayarlarına taşındı; su dokularının ve heightmap’in dünya ölçeğinde tutarlı kontrolü sağlandı.​
  • Çok frekanslı heightmap örnekleme (anti-tiling)
    Tek bir UV yerine farklı ölçek ve hızlarda birden fazla heightmap örneklenerek:​
    • Tekrarlama hissi azaltıldı​
    • Büyük dalga + orta hareket + küçük ripple katmanları elde edildi​
  • Su mesh çözünürlüğü ciddi şekilde artırıldı
    Her terrain hücresi, sabit 2 üçgen yerine WATER_SUBDIV ile alt parçalara bölündü.
    Bu, heightmap displacement’ın gerçekten geometrik olarak görünmesini sağladı.​
  • Alpha değerleri alt mesh’e bilinear olarak dağıtıldı
    Kıyı geçişleri (shoreline fade) yüksek çözünürlüklü mesh üzerinde de yumuşak ve tutarlı kaldı.​
  • Water vertex formatı genişletildi
    Su vertex’lerine pozisyona ek olarak UV bilgisi eklendi; bu da shader tarafında daha esnek kullanım sağladı.​
  • Sampler state’ler vertex texture kullanımına uygun hale getirildi
    Heightmap için point sampling + clamp adresleme kullanılarak:​
    • Vertex shader’da deterministik sonuç​
    • Kenar taşmaları ve mipmap kaynaklı bozulmalar önlendi​

 
SkyBox güncellemesi

  • Skybox render yolunu DirectX9 Fixed Function Pipeline’dan tamamen ayırıp shader tabanlı yapıya taşıdım.
  • Eski SKY_RENDER_MODE_* sabitlerini kaldırarak tip güvenli ESkyBoxRenderMode enum’u oluşturdum ve render modunu merkezi ShaderSettings üzerinden yönetir hale getirdim.
  • Skybox için özel vertex declaration (CSkyBoxVertexDecl) tanımlayıp FVF kullanımını tamamen kaldırdım.
  • Skybox ve bulutlar için ayrı vertex / pixel shader’lar yazdım (skybox_vs/ps, cloud_vs/ps) ve mevcut ShaderManager altyapısına entegre ettim.
  • Önceden texture stage state’lerle yapılan Diffuse / Texture / Modulate / 2X / 4X davranışlarını pixel shader içinde birebir karşılayacak şekilde yeniden implemente ettim.
  • Skybox render sırasında artık SetTextureStageState, SetFVF, SetTransform(D3DTS_*) gibi FFP çağrıları kullanılmıyor; WVP, render mode ve diğer parametreler doğrudan shader constant’larıyla set ediliyor.
  • Cloud rendering tarafında texture transform ve color-op tabanlı FFP kodlarını kaldırıp, UV scale/scroll ve projection hesaplarını tamamen shader tarafına taşıdım.
  • Skybox ve cloud shader parametrelerini Yosun Admin Panel üzerinden canlı ayarlanabilir hale getirdim (render mode, UV scale, scroll speed, projection vb.).
  • Sonuç olarak skybox ve bulutlar artık FFP’ye bağımlı değil, shader tabanlı, genişletilebilir ve DX11’e taşınmaya hazır bir yapı üzerinde çalışıyor.

 
Geri
Üst