Vesperis2 (N2Play Altyapısı) - Geliştirme Günlüğü

  • Konuyu açan Konuyu açan Sys
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 42
  • Gösterim Gösterim 2K
Piyasadaki 20 yıllık, kapalı kaynak ve sürekli çöken antika Granny araçlarının yetersizliğinden dolayı DirectX 11 ile sıfırdan modern bir GR2 inceleme aracı geliştirdim.

Kısaca neler yapabiliyor:

DirectX 11 donanımsal gölgelendiriciler ile tel kafes, çift taraflı aydınlatma, kemik ağırlık haritası ve yüzey normalleri denetimi.
Oyundaki +9 parlama efektlerini ve özel auraları doğrudan karakterin eline veya zırhına bağlayıp canlı simüle etme.
MSM dosyalarını doğrudan okuyup zırh, saç, kask ve silahları tek seferde montajlayıp iskeletle senkronize oynatma.
Modelleri tek tıkla glTF 2.0 (glb) veya OBJ olarak Blender ve 3ds Max için dışa aktarma.
Çift kanal animasyon harmanlama ve akıllı kamera odaklama modları.
Testlerini yeni tamamladım, performansı ve stabilitesi gayet iyi durumda. Yakında tüm detayları, ekran görüntülerini ve indirme bağlantılarını paylaşacağım kapsamlı bir ana konu açacağım.


Videolu Spoiler :D @hasanmacit


Süper olmuş eline sağlık sen de libOodle mı kullandın modelleri okumak için?
 
Süper olmuş eline sağlık sen de libOodle mı kullandın modelleri okumak için?
Teşekkürler adaşımmm Harici bir libOodle kütüphanesi yerine doğrudan RAD Game Tools'un yerel Granny SDK API'sini modern C++23 mimarisiyle Direct3D 11 pipeline'ına bağladım. Granny motoru arka planda Oodle dekompresyonunu zaten native olarak hallettiği için harici wrapper katmanlarına gerek kalmadan tüm .gr2 sürümlerini (2.4 - 2.9+) %100 uyumluluk ve sıfır çökme ile doğrudan GPU vertex buffer'larına aktarıyorum.
 
Teşekkürler adaşımmm Harici bir libOodle kütüphanesi yerine doğrudan RAD Game Tools'un yerel Granny SDK API'sini modern C++23 mimarisiyle Direct3D 11 pipeline'ına bağladım. Granny motoru arka planda Oodle dekompresyonunu zaten native olarak hallettiği için harici wrapper katmanlarına gerek kalmadan tüm .gr2 sürümlerini (2.4 - 2.9+) %100 uyumluluk ve sıfır çökme ile doğrudan GPU vertex buffer'larına aktarıyorum.
Anladım ben direkt kodumda telifli tek bir satır bile olmasın diye liboodle kullanıp granny sdk olmadan viewer hazırlattım yapay zekaya. Yarın öbür gün baş ağrıtmasın
 
Anladım ben direkt kodumda telifli tek bir satır bile olmasın diye liboodle kullanıp granny sdk olmadan viewer hazırlattım yapay zekaya. Yarın öbür gün baş ağrıtmasın
Satmak paylaşmak gibi bir amacımız yok bir sorun olacağını zannetmiyorum kendimize göre eğleniyoruz.. En fazla derlenmiş exe veririm diye düşünüyorum :D :rockband:
Who Knows Yes GIF by Bounce
 
Directx 9 dan kurtulacağım bir gün :D ya dx9'da tamamen shader geçeceğim veya dx11 için bi ara başlayacağım.. ( :alsaa: ) Emoji iç sesim gibi :D

[SpeedTree 4.1 Güncellemesi]:
Genişlet Daralt Kopyala
SpeedTreeRT 1.6'sürümünden SpeedTreeRT 4.1 sürümüne yükseltildi yeniden yapılandırıldı.
3 Boyutlu Gür Yaprak Hacmi: Yaprakların yandan düz görünmesi engellendi, her yaprağa doğal açısal dağılım verilerek yaprak örtüsü 1.5 kat daha dolgun ve hacimli hale getirildi.(Metin2 nin lanet z ekseni problemi)
Dal ve Yaprak Senkronu: Yapraklar rüzgarla esneyen dal uçlarına tam kilitlendi dalların yaprakların dışına taşma problemi giderildi.
Ağaçların gövde eğilme açısı, yaprak titreşimi ve dalgalanma hızları daha belirgin ve doğal bir esinti hissi verecek şekilde ayarlandı.
Ekran köşelerinde ağaçların aniden kaybolması/titremesi engellendi; kamera dışındaki ağaçların hesaplamaları kısılarak FPS verimliliği artırıldı.


 
İstemci tarafında oyunun 20 yıllık eski ve dağınık render yapısını toparlamak için RenderLib adında sıfırdan bağımsız bir grafik kütüphanesi oluşturdum. RenderLib nedir, içinde ne var ve ne işe yarıyor kısaca özetlemek istedim

RenderLib, oyunun tüm modern grafik ve shader süreçlerini tek bir merkezden yöneten yeni grafik motoru çekirdeğimizdir.
Shader Yöneticisi (ShaderManager): Ekran kartında çalışan tüm shader'ların (gökyüzü, su, arazi vb.) derlenmesini, açılıp kapanmasını ve birbiriyle çakışmadan çalışmasını yönetir.


1786915591434.webp


2. Canlı Geliştirici Paneli (Dear ImGui)
RenderLib'in bize kazandırdığı en büyük kolaylıklardan biri de oyun içi canlı kontrol merkezi oldu

F11 tuşu ile açılan panelden gökyüzü renklerini ve efekt hızlarını oyunu kapatıp açmadan anında deneyebiliyoruz.
Canlı FPS ve milisaniye (ms) kare çizim grafiği sayesinde yapılan her grafik dokunuşunun performans etkisini eşzamanlı olarak ölçebiliyoruz.


İlk etap olarak gökyüzünü seçtim :D (aşırı kolaydı)

 
RenderLib ve Sabit Fonksiyonlu Boru Hattının Kaldırılması

RenderLib'i bir üst yorumda az biraz anlatmıştım. :D

Eski Direct3D Sabit Fonksiyonlu Boru Hattı'nın (FFP) tamamen tasfiye edilmesi, yani artık tamamen kaldırılması amacıyla merkezi RenderLib kütüphanesi kuruldu.

SkyBox, Bulutlar, Su, Arazi (Terrain Splatting), SpeedTree ağaçları ve Granny 3D modelleri saf HLSL Shader Model 3.0 tekniklerine geçirildi.

Granny modelleri için 5 bağımsız kategori (Oyuncu, Zırh, Silah, Binek/Pet, Canavar/Bina) oluşturuldu.

Canlı metalik parlama (Sphere Map Specular), sinematik kenar aydınlatması (Rim Light), dinamik difüz çarpanları ve gama düzeltmesi entegre edildi.

Cascaded Shadow Mapping (CSM) ve Gölge Sistemi

4096x4096 çözünürlüğünde, 3 kaskadlı (Yakın, Orta, Uzak) CSM gölge atlası oluşturuldu.

16-Tap Poisson Disk PCF yumuşatma filtresi, eğim tabanlı derinlik önyargısı (Slope-Scale Depth Bias) ve Normal Offset Bias uygulandı.

Işık uzayı ızgara sabitlemesi (True World-Space Texel Snapping) ile özellikle binek üzerindeyken veya koşarken oluşan gölge titremeleri (shimmering) büyük ölçüde engellendi.

Harita, Işınlanma ve Bellek Döngüsü Düzeltmeleri

Harita değişimlerinde ve peş peşe gerçekleştirilen ışınlanmalarda yaşanan boş işaretçi (null dereference) ve Use-After-Free kaynaklı çökmeler giderildi.

FPS ve Çizim Boru Hattı Optimizasyonları

Gölge kapatıldığında gereksiz yere çalışan 4K atlas temizleme işlemleri ve 3 kaskadlık harita/ağaç çizimleri erken çıkış ile durduruldu.

D3DX derleyici optimizasyonu en üst seviyeye (Level 3) çekildi ve model aydınlatmasına dirty-flag önbelleklemesi eklenerek gereksiz uniform aktarımları engellendi.

Kare başına çalışan paralel sıralama maliyetleri (thread-pool context switch) kaldırılarak işlemci ve ekran kartı üzerindeki gereksiz yük hafifletildi.

Not: Gölge sistemiyle işim henüz bitmedi. Bu yüzden şu aşamada birkaç çözümü geçici olarak ekledim. FFP ile işim tamamen bittikten sonra gölge sistemine tekrar dönüp gerekli düzenlemeleri yapacağım.

FPS düşüşü şu an gerçekten çok fena oldu. :D Bazen Keşke Print ile yapıştırmaya devam etseydim. dediğim de oluyor ama görsele bakınca içim ferahlıyor. :D

Tamamlanan Shader Modülleri

Videoda var olanlar dışında :D diğer shader modülleri de hâlâ duruyor. Onların da tamamlanmasıyla birlikte yaklaşık 1-2 hafta içerisinde tamamen shader sistemine geçmiş olurum gibi görünüyor.







ERutSx.png


ERu6HC.png


ERuJoL.md.png


ERu2rH.png
 
RenderLib ve Sabit Fonksiyonlu Boru Hattının Kaldırılması

RenderLib'i bir üst yorumda az biraz anlatmıştım. :D

Eski Direct3D Sabit Fonksiyonlu Boru Hattı'nın (FFP) tamamen tasfiye edilmesi, yani artık tamamen kaldırılması amacıyla merkezi RenderLib kütüphanesi kuruldu.

SkyBox, Bulutlar, Su, Arazi (Terrain Splatting), SpeedTree ağaçları ve Granny 3D modelleri saf HLSL Shader Model 3.0 tekniklerine geçirildi.

Granny modelleri için 5 bağımsız kategori (Oyuncu, Zırh, Silah, Binek/Pet, Canavar/Bina) oluşturuldu.

Canlı metalik parlama (Sphere Map Specular), sinematik kenar aydınlatması (Rim Light), dinamik difüz çarpanları ve gama düzeltmesi entegre edildi.

Cascaded Shadow Mapping (CSM) ve Gölge Sistemi

4096x4096 çözünürlüğünde, 3 kaskadlı (Yakın, Orta, Uzak) CSM gölge atlası oluşturuldu.

16-Tap Poisson Disk PCF yumuşatma filtresi, eğim tabanlı derinlik önyargısı (Slope-Scale Depth Bias) ve Normal Offset Bias uygulandı.

Işık uzayı ızgara sabitlemesi (True World-Space Texel Snapping) ile özellikle binek üzerindeyken veya koşarken oluşan gölge titremeleri (shimmering) büyük ölçüde engellendi.

Harita, Işınlanma ve Bellek Döngüsü Düzeltmeleri

Harita değişimlerinde ve peş peşe gerçekleştirilen ışınlanmalarda yaşanan boş işaretçi (null dereference) ve Use-After-Free kaynaklı çökmeler giderildi.

FPS ve Çizim Boru Hattı Optimizasyonları

Gölge kapatıldığında gereksiz yere çalışan 4K atlas temizleme işlemleri ve 3 kaskadlık harita/ağaç çizimleri erken çıkış ile durduruldu.

D3DX derleyici optimizasyonu en üst seviyeye (Level 3) çekildi ve model aydınlatmasına dirty-flag önbelleklemesi eklenerek gereksiz uniform aktarımları engellendi.

Kare başına çalışan paralel sıralama maliyetleri (thread-pool context switch) kaldırılarak işlemci ve ekran kartı üzerindeki gereksiz yük hafifletildi.

Not: Gölge sistemiyle işim henüz bitmedi. Bu yüzden şu aşamada birkaç çözümü geçici olarak ekledim. FFP ile işim tamamen bittikten sonra gölge sistemine tekrar dönüp gerekli düzenlemeleri yapacağım.

FPS düşüşü şu an gerçekten çok fena oldu. :D Bazen Keşke Print ile yapıştırmaya devam etseydim. dediğim de oluyor ama görsele bakınca içim ferahlıyor. :D

Tamamlanan Shader Modülleri

Videoda var olanlar dışında :D diğer shader modülleri de hâlâ duruyor. Onların da tamamlanmasıyla birlikte yaklaşık 1-2 hafta içerisinde tamamen shader sistemine geçmiş olurum gibi görünüyor.







ERutSx.png


ERu6HC.png


ERuJoL.md.png


ERu2rH.png

 
zamanında şu src nin hunter ve boost kütüphanelerinde neler çektim bir ben bir cursor bilir aah ah
 
zamanında şu src nin hunter ve boost kütüphanelerinde neler çektim bir ben bir cursor bilir aah ah
Aslında pek de dert değil. Projeye girmeden mecburen derlemek zorunda kalmıştım, 2-3 saat uğraştırmıştı. Değer mi diye düşünmüştüm
Şimdiki düşüncem değmezmiş.. sıfırdan bir dosyaya başlamak daha mantıklıymış.

Şimdi vcpkg üzerinden gidiyorum. Sürümü de kilitlemedim zaten. Amacım oyunu açmaktan çok kendime uğraş çıkarmak olduğu için güncel kalmak adına ne varsa yapıyorum. 1-2 saat sadece fikir arıyorum. Belki birçok oyun açan kişiden daha detaylı yapıyorumdur düzenlemelerimi...

Onun dışında ilk CMake'de modül ayrımı yoktu, aşırı tilt etmişti beni. 10 dakika build mi sürer be kardeşim, 9950X3D var. Şimdi sıfırdan derlesem bile 2-3 dakika civarına düştü.

Dosyalarda bayağı kapsamlı değişiklikler yaptım ama hepsini foruma yazıp atmaya pek vaktim olmadı ya da üşendim.

SQL tablolarına kadar el atmışmımdır
Hepsi nizami ve düzenli. Örnek olarak account tablosunun görseli

1787085079205.webp
 
Mini-update:


Biraz daha SpeedTree 4.1'in nimetlerinden yararlandım
Leaf Rocking ve Rustle: Yapraklarin daldaki genis ritmik salinimi ve ruzgar siddetine bagli canli mikro titresimleri (hisirti) eklendi.
Senkronize Golge: Agaclar ruzgarda esneyip yapraklar dalgalandikca yerdeki golgeleri de birebir ayni anda salinir
yaprak yoksa gölge yok :D csm'de dalgınlığıma gelmiş onu düzelttim :D
Agaç gövdeleri'de güneşe göre gölge de alır :D halen dinamik güneşim yok üzücü bi ara ona da el atarım :aman:

 
Hava durumu:
Genişlet Daralt Kopyala
- WeatherShader.hpp HLSL SM 3.0 mimarisi inşa edildi (WeatherSnow, WeatherRain, WeatherSplash teknikleri).
- Kar parçacıklarının render döngüsü RenderLib::ShaderManager'a taşındı, eski FFP SetTextureStageState ve StateManager çağrıları tamamen temizlendi.
- D3D9 vertex hizalaması düzeltildi (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) ve LockVertexBuffer köşe sayısı boyutu düzeltildi.
- Yumuşak anti-aliased dairesel parçacık maskesi ve kendi ekseninde dönen billboard entegre edildi.
- Imgui arayüzüne canlı hava durumu sekmesi, rüzgar, düşme hızı, parçacık sayısı ve hazır profiller eklendi.


dfrerw4c.png



be3x2r0h.png
 
Silah ve Ok İzleri (Weapon & Fly Trace) Aktif Edildi & FFP kaldırıldı:
Genişlet Daralt Kopyala
Oyunda uzun süredir pasif ve hatalı olan kılıç savurma ve ok/mermi izleri tamamen aktif edildi.
Sistem eski DirectX FFP (Fixed Function Pipeline) kalıntılarından tamamen arındırılarak modern HLSL SM 3.0 shader mimarisine geçirildi
artık çok daha yumuşak, akıcı ve gözü yormayan estetik bir hareket hissiyatına sahip (Sabah saatlerinde bitirmiştim iş sebebiyle güncelleme atamadım :D )

 
Büyük güncelleme geldi:
Genişlet Daralt Kopyala
Uzun suredir uzerinde ugrastigim zindan (dungeon) tarafindaki grafik motoru ve shader donusumunden biraz bahsetmek istedim. shader sürecinden beri sıkıntısını kafamda dert ediyordum halletim çok şükür :D

Metin2'nin klasik grafik motorunu biliyorsunuz zaten 2000'lerin basindan kalma sabit fonksiyonlu (FFP) directx 8-9 komutlariyla calisiyor. Normal acik dunya haritalarinda bir sekilde idare etse de
is zindan bloklarina, piramit veya katakomp gibi haritalara gelince motor patliyor resmen.

Benim karsilastigim ve cozdugum temel sorunlar ve mantik soyleydi:

1) Zemin Cakismasi ve Elle Ayar Derdi
Klasik altyapida zindan eklediginde setting.txt icine gidip TerrainVisible 0 yazmazsan motor alta simsiyah dummy bir arazi ciziyor. Bu da Z-buffer cakismalarina (z-fighting) ve zeminin siyaha dusmesine neden oluyor.
Bunu harita isminden string aratarak cozmek yerine sahneye obje yuklenirken dogrudan geometri seviyesinde yakaladim metin2 haritalarından farklı bir zindanda'da denedim

// CArea tarafinda zindan blogu (.prd) sahneye girdigi an motor araziyi otomatik kapatiyor
if (pObjectInstance->dwType == PROPERTY_TYPE_DUNGEON_BLOCK) {
    if (m_pOwnerOutdoorMap)
        m_pOwnerOutdoorMap->NotifyDungeonBlockPresent();
}

Boylece yeni zindan haritasi eklediginde setting.txt ile ugrasmana gerek kalmiyor motor kendisi algiliyor.

2) Karakterin Basamaklara Gomulmesi ve Tiklama (Ray-Picking)
TerrainVisible'i kapattigin an motordaki GetHeight ve Picking fonksiyonlari arazi aradigi icin zindanda zemine tiklayamiyorsun veya karakter basamaklarin icine gomuluyor.
Bunu CDungeonBlock'u CCullingManager ve attribute instance (.mdatr) taramasina dahil ederek cozdum.. -25000 kotuna kadar zindan zeminini eksiksiz okuyor artik karakterler taslarin ustune tam oturuyor fareyle de rahatca tiklaniyor.

3) HLSL SM 3.0 ve Cift Dokulu (Lightmap) Shader
Zindanlarda 2 farkli yapi var: Tek dokulu duz taslar ve 3ds Max'ten firinlanmis (baked lightmap) 2 dokulu mimari parcalar. Eski TextureStageState komutlarini tamamen cope atip saf HLSL shader yazdim

Cekirdek mantik kabaca soyle:

float4 ComputeDungeonLighting(float4 baseColor, float3 worldPos, float3 inNormal, float vFace, float fogValue, float3 lightmapMod)
{
    // Cift tarafli poligonlarda normali vFace ile otomatik duzeltiyoruz
    float3 geomNormal = (vFace >= 0.0f) ? inNormal : -inNormal;
    float3 normalizedNormal = safeNormalize(geomNormal);
    float3 EyeVec = g_vCameraPos.xyz - worldPos;
   
    // Difuz ve baked lightmap harmanlamasi
    float3 color = baseColor.rgb * diffuseLight.rgb * lightmapMod;
   
    // Dinamik Cascaded Shadow Mapping (CSM)
    float shadow = SampleShadowCSM(worldPos, normalizedNormal);
    color *= shadow;
   
    // Bakis acisina gore islak/cilali tas efekti (Fresnel Sheen)
    float fresnel = pow(1.0f - saturate(dot(safeNormalize(EyeVec), normalizedNormal)), 3.5f);
    color += specLightColor * fresnel * g_fDungeonSpecularPower * 0.35f;
(Sürgün Mağrasında iyi iş yapıyor :D )

    color *= g_vDiffuseColor.rgb * g_vDungeonColorTint.rgb;
    return float4(lerp(g_vFogColor, color, fogValue), diffuseLight.a);
}

4) Islak Zemin ve Parlama (Fresnel Sheen)
Metin2'nin zindan modellerinde genelde specular tanimli olmadigi icin zeminler mat plastik gibi durur.
hem sahne isigindan beslenen Blinn-Phong hem de kameranin bakis acisina gore hafif parlayan Fresnel gloss ekledim. Boylece zindan zeminleri ve duvarlar yagli/cilali tas gibi cok daha derinlikli gorunuyor.

Tum bu yapiyi modern C++23 akilli isaretcileriyle (std::unique_ptr) sardik eski stl_wipe ve ham pointer islerini de temizledim

Sorusu veya başka fikir önerisi olan varsa tartisabiliriz iyi forumlar cümleten.




Bonus :D
1787172100241.webp
 
Son düzenleme:
Geri
Üst