SpeedTree-4.1 Geçiş Serüveni

  • Konuyu açan Konuyu açan Sys
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 0
  • Gösterim Gösterim 34

Sys

MT Üye
MT Üye
Mesaj
227
Çözümler
4
Beğeni
347
Puan
784
Ticaret Puanı
0
Merhaba arkadaşlar,

Uzun uğraşlar sonucunda SpeedTree 1.6'dan 4.1 sürümüne geçişi başarıyla tamamladım. Açıkçası beklediğimden çok daha meşakkatli bir süreç oldu. 😄 Bu süreçte karşılaştığım önemli sorunları ve yaptığım modernizasyonları aşağıda paylaşıyorum.

32-Bit Index Buffer Fix (Geometry Holes / Tearing):
Genişlet Daralt Kopyala
1. 32-Bit Index Buffer Fix (Geometry Holes / Tearing)

When migrating from 16-bit to 32-bit index buffers (D3DFMT_INDEX32), the way the index buffer size is calculated and populated must be updated.

In the original 16-bit implementation, SpeedTree used pBranches->m_pStripLengths[i][0] as the index count, which rendered only the first strip of each branch.

After switching to D3DFMT_INDEX32, continuing to use the old logic while processing the complete index list resulted in severe geometry corruption, including holes and mesh tearing.

Fix:

Correctly calculate the index count using m_pGeometryCache->m_sBranches.m_pStripLengths[i][0].
Allocate the index buffer using sizeof(uint32_t) instead of sizeof(uint16_t) when D3DFMT_INDEX32 is used.

This resolves the geometry corruption and ensures all branch strips are rendered correctly.
1785184265115.webp

Refactoring (Modern C++23):
Genişlet Daralt Kopyala
Refactoring (Modern C++23)

SpeedTreeLib modülü, mevcut mimari korunarak (%100 davranış uyumluluğu) tamamen C++23 standartlarına uygun şekilde modernize edildi.

Yapılan iyileştirmeler
Smart Pointers
CSpeedTreeWrapper içerisindeki m_pSpeedTree artık std::unique_ptr kullanıyor.
Paylaşılan kaynaklar (m_pTextureInfo, m_pGeometryCache) std::shared_ptr ile yönetiliyor.
Böylece manuel SAFE_DELETE kullanımı ve olası bellek sızıntıları tamamen ortadan kaldırıldı.
Dynamic Arrays
new[] ile oluşturulan diziler (m_pBranchIndexCounts, m_pLeafVertexBuffer vb.) std::vector ile değiştirildi.
Bellek yönetimi artık tamamen otomatik.
Static Arrays
float m_afPos[3], float m_afBoundingBox[6] gibi C dizileri std::array ile değiştirildi.
.data() kullanımı sayesinde DirectX API'leriyle tam uyumluluk korundu.
Type Safety
#define tabanlı render flag'leri enum yapısına taşındı.
Eski C tarzı memcpy kopyalamaları mümkün olan yerlerde doğrudan C++ atama operatörleri (=) ile değiştirildi.
Virtual Functions
Tüm override edilen sanal fonksiyonlara override anahtar kelimesi eklendi.
Böylece derleme sırasında hataların yakalanması kolaylaştı ve kodun okunabilirliği arttı.
Kod Kalitesi
Eski C-style kalıntılar temizlendi.
Kod tabanı daha güvenli, okunabilir ve bakım yapılabilir hale getirildi.

SpeedTree 4.1 artık sorunsuz şekilde çalışıyor. Geçiş süreci oldukça zahmetliydi ama sonunda hem daha modern hem de daha sağlam bir altyapı ortaya çıktı. Umarım aynı geçişi yapmayı düşünen arkadaşlara motivasyon konusunda faydası olur. 😊


SpeedTree 1.6 ve SpeedTree 4.1 sürümlerine ait karşılaştırmalı video ve ekran görüntülerini aşağıda paylaşıyorum.

İlk bakışta bile en belirgin farklar açıkça görülebiliyor. Özellikle ağaçlar artık tamamen bağımsız gölgelendirme çalışıyor. Bunun yanı sıra yapraklar çok daha dolgun, doğal ve hacimli görünüyor. Genel görüntü kalitesi, ışıklandırma(Halen Tam manasıyla bitmedi.. çok fazla baş ağrısı geçirdiğim için sonra bakacağım bu lanet probleme :D ) ve ağaçların sahneyle bütünleşmesi eski sürüme kıyasla belirgin şekilde iyileşmiş durumda.





SpeedTree 1.6
EdvGWM.png



SpeedTree 4.1
EdvIao.png
 
Son düzenleme:
Geri
Üst