Çok eski bir web tarayıcısı kullanıyorsunuz. Bu veya diğer siteleri görüntülemekte sorunlar yaşayabilirsiniz.. Tarayıcınızı güncellemeli veya alternatif bir tarayıcı kullanmalısınız.
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.
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
Directx 9 dan kurtulacağım bir gün ya dx9'da tamamen shader geçeceğim veya dx11 için bi ara başlayacağım.. ( ) Emoji iç sesim gibi
[SpeedTree 4.1 Güncellemesi]:
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.
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.
RenderLib ve Sabit Fonksiyonlu Boru Hattının Kaldırılması
RenderLib'i bir üst yorumda az biraz anlatmıştım.
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.
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. Bazen Keşke Print ile yapıştırmaya devam etseydim. dediğim de oluyor ama görsele bakınca içim ferahlıyor.
Tamamlanan Shader Modülleri
Videoda var olanlar dışında 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.
RenderLib ve Sabit Fonksiyonlu Boru Hattının Kaldırılması
RenderLib'i bir üst yorumda az biraz anlatmıştım.
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.
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. Bazen Keşke Print ile yapıştırmaya devam etseydim. dediğim de oluyor ama görsele bakınca içim ferahlıyor.
Tamamlanan Shader Modülleri
Videoda var olanlar dışında 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.
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
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 csm'de dalgınlığıma gelmiş onu düzelttim Agaç gövdeleri'de güneşe göre gölge de alır halen dinamik güneşim yok üzücü bi ara ona da el atarım
- 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.
Silah ve Ok İzleri (Weapon & Fly Trace) Aktif Edildi & FFP kaldırıldı:
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 )
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.