Bir zamanlar, renk ve derinlik tamponlarını temizlemek gerçekten zaman aldı. Net yapmak, grafik kartının çerçevenin her pikselini gezmesi ve buna değer yazması gerektiği anlamına geliyordu.
Bu nedenle oyun geliştiricileri, her pikselin tekrar işleneceğini varsaymanın daha verimli olacağını keşfetti. Bunu yapmak için birçok teknik geliştirdiler.
Renk arabelleği yoksaymak en kolay olanıdır. Derinlik tamponu daha az kolaydır, çünkü eski verilerle kirlenecektir. Yani yaptıkları basitti.
Çerçeve 0., bir ile render glDepthRange
(0, 0.5) arasında (veya D3D eşdeğer), ve bir kullanmak glDepthFunc
arasında GL_LESS
(ya da GL_LEQUAL
). Bu, derinlik tamponunda elde edebileceğiniz en uzak derinlik değerinin 0,5 olduğu anlamına gelir. Dolayısıyla, 0 karesinin sonundaki derinlik arabelleğindeki en büyük değer 0,5'tir (her piksele yazdığınız varsayılmaktadır).
Çerçeve 1'de derinlik aralığını (1, 0.5) değiştirirdi. Bu durumda, yakın derinlik değerinin uzak derinlikten daha büyük olduğuna dikkat edin . Fakat aynı zamanda derinlik fonksiyonunu GL_GREATER
(veya GL_GEQUAL
) değiştirir, bu da derinlik testinin anlamını tersine çevirir. Derinlik arabelleğindeki en büyük değer 0,5 olduğundan, yazdığınız her şey bundan daha büyük bir değere sahip olacaktır . Derinlik testi tersine bu yana, bu etkili bir çerçeve 0 yazılmıştır ne olursa olsun uzağa muhtemelen çerçeve 1 'in sonunda çerçeve 1 üzerine yazılabilir şeyden artık anlamına gelir küçük derinlik tamponunda değeri artık 0.5'tir.
Ve sonra tekrarlar.
2003 yılından bu yana yapılan herhangi bir donanımda, bu artık bir optimizasyon değil. Gerçekten de, olumsuz bir optimizasyon . Derinlik tamponunu temizlemek aslında donanımı daha hızlı yapar . Hayır, gerçekten.
Temel olarak, olan şey, tamponların silinmesinin aslında hiçbir şey yazmadığıdır. GPU'nun önbelleklerinde, sisteme hangi renk / derinliğe temizlendiklerini bildiren bazı bitler depolar. Sistem çerçeveleyicinin önbellek satırına yazmaya çalıştığında, orada olanı okumak zahmete girmez, çünkü zaten net renk / derinlik değerinin boş bir alanı olduğunu bilir. Var olanla karıştırmaya çalışırsanız veya derinlik testi yaptırırsanız, tekrar okumaya gerek yok: hangi değerle karıştırıp / karşılaştırılacağını bilir.
Bu nedenle, bir temizlemeden sonra her önbellek satırında yaptığınız her okuma / değiştirme / yazma temel olarak bir yazıdır. Bu var ücretsiz .
Ayrıca, pürüzlü bir derinlik tamponuna sahip olmak, donanımdaki Hyper-Z / Hierarchial-Z / Z-culling optimizasyonlarına karşı çalışabilir. Evet, sahneyi ayrıntı eklerken en sonunda bunlara karşı çalışır. Ancak, derinlik tamponunuz önceki görüntülemelerden tırtıklıysa, bu arka plan nesneleri arka planda olsa bile, Z-ayırma tekniklerinin verimliliğini etkileyebilir. Ve bu performansa yardımcı olmayacak.
Bu yüzden modern oyunlarda bu derinlik ters tekniğini asla yapmamalısınız .
Not: Jari, karo tabanlı işleme mimarilerinde (çoğu mobil platformda olduğu gibi) iyi bir noktaya değinmektedir. Derinliği temizlememek orada da rahatsız edici şeyler yapabilir.