Bu başlığa güncelleme zamanı! Geç cevaplar için özür. Şehir dışındaydım...
fakat uzak duvarlardaki texture'lar sağa sola sallanıyor hatta bazen hepten yok oluyorlar, bu hiç hoş değil:
Bu problemin başka bir bug olmadığından emin misin. mesela precision'ı 6 bit yerine 8 bite veya 16 bite çıkarınca bug ortadan kalkıyor mu?...
Aynen abi. Duvarlara yaklaşınca oluşan bozulma precision’ı 10 bit'e çıkarınca ortadan kalkıyor. 16 bit'e ise hiç çıkarmak istemiyorum. Çünkü bazı hesaplamalarda precision’ı kaybetmemek için sola iki kez bitshift yapıyorum. Bu değişkenlerimi double yapmak zorunda bırakır. Bunu istemiyorum. Önerdiğin gibi 8 bit kullanıp, high word'ü doğrudan okumak süper olur. Yalnız C'de bunun için yazacağım kod ne kadar verimli olur bilemiyorum? Keşke Assembly bilsem.
Uzak duvarların kaybolmasının nedeni ise, mapping’de kullandığım bir değişkenin (her satırdaki duvar uzaklığı) de precise olması gerektiğindenmiş. Onu halledince o da düzeldi.
Bu arada görsellerden de anlaşılacağı gibi “perspective correct texture mapping” yapıyorum (her satırda duvar uzaklığı bu yüzden gerekli). Şehirlerarası yolda 90’lı yıllardaki öncü 3D oyunların görsellerini youtube’dan bol bol inceledim. “Legends of Valour” ve “Ultima Underworld” çok dikkatimi çekti. Bu ikisinin de PC versiyonu “perspective correct” kullanmıyor gibi. Affine kullanıyorlar sanki (bazı açılarda perspektif bozulmaları var çünkü texture’larda).
Ben de duvarları daha küçük duvarlara bölüp her duvar için Affine mapping yapmaya karar verdim.
Böylece satır başına birkaç çarpma bölme işleminden daha kurtulmuş oldum. Fakat bu defa da daha fazla vertex transform edilmek zorunda. Parça duvarların ve texture’ın genişliğini, perspektif bozulmasının fazla hissedilmeyeceği kadar büyütüp bir ortalama yakalamaya çalıştım. Hazır elim değmişken texture’ı da tümden değiştirdim. Belirttiğin gibi gradient’li bir şey yapmaya çalıştım. Gerçekten fark yarattı.
NOT: Bu arada Legends of Valour’un Amiga sürümüne de baktım. Zemin döşemesini çıkarmışlar, fakat duvarlar “perspective correct”! Çok ilginç değil mi?
Bu haliyle FPS 060 Amiga’mda üst sınır olan 50’ye dayandı. Fakat duvarlara yakın olunduğunda (en az 25’e kadar) düşebiliyor.
Tüm bu optimizasyonlara rağmen, hala stok A1200’de bir Legends of Valour FPS performansını yakalayabilmiş değilim (Affine kullanmama rağmen 7-10 FPS’in üzerine çıkamadım hala). Bir şeyleri doğru yapmıyor olmalıyım.
Tahminimce hesaplamalarda değil de, pikselleri ekrana yazdırırken oluyor ne oluyorsa.
Ya da bu oyunlar Assembly ile yazıldığı için mi daha hızlı, bilemiyorum?
Bir de gcc ile mi derlesem acaba? Bakıcaz…
Denemelerim sürecek, bakalım daha neler öğreneceğim.
Çok detaylı yazamıyorum şu aralar. Aslında bu thread bayağı bir güzelleme hakediyor. Kusuruma bakmayın. Ama süper gidiyor.
Yorumların hem fikir, hem gaz veriyor, hem de biraz şımartıyor abi.
Yoğun olduğunu biliyorum. Kıp kısa yazsan da hiç sorun değil. Zaten tek satırda bile 40 yıl düşünsem aklıma gelmeyecek fikirler veriyorsun. Çok sağol valla.
EDIT: Bir de executable atacaktım. Unutmuşum. Buyrun efendim.
Hareket için: W,A,S,D
Tam ekran : F
Çıkış : Q