2013-10-19 12 views
7

Bir OpenGL kodu çalıştırmaya çalışıyordum, bu yüzden sahnemi oluşturamadığım için glClear() öğesinde GL_DEPTH_BUFFER_BIT temizlendi. Bu biti ekledim ve sahne işlendi. Bu açık biti kullanmak neden gereklidir?Açılış sırasında OpenGL'de derinlik arabelleğini temizlemek zorundayız?

Önceden GPU tarafından kullanılan derinlik arabellek değerlerini temizlemek için bunun nedenini biliyorum, ancak yalnızca onaylamak istiyorum.

cevap

15

Derinlik Tamponu, görüntüdeki pikselin "derinliğini" tutar. OpenGL geometrinizi oluşturduğunda, her parça (piksel) bu noktada derinlik tampon değerine göre karşılaştırılır. Eğer bu parça, tampondaki bir değerden daha düşük bir z değerine sahipse, yeni en düşük değer ve dolayısıyla oluşturulacak piksel olur. Aksi halde, oluşturma - bunu engelleyen bir şey var. Bu, no.lu budur - ayrıntılarını kendiniz okuyabilirsiniz.

Şimdi, sahne değiştiğinde ne olur? ekran ekranını temizlemek istersiniz, böylece her şeyi yeniden çizersiniz, ancak derinlik arabelleğini de temizlemek istersiniz. Neden? Aksi takdirde, tüm yeni pikseller önceki kareden derinlik değerleriyle karşılaştırılacaktır. Bu mantıklı değil - içinde oldukları çerçevede olanlarla karşılaştırılmalıdır! Muhakemenizde haklısınız.

+4

Ayrıca derinlik aralığını ve derinlik testinin yönünü her bir kareyi de değiştirebilirsiniz. Ancak, derinlik tamponunu temizlemenin aynı zamanda modern donanım üzerinde bir performans optimizasyonu olduğunu ortaya koyuyor - GPU ihtiyaçlarının sadece birkaç bit okumasını/yazmasını sağladığında çerçevebufferi fayansa bölerek kayıpsız Z-Tampon (ve renkli tampon) sıkıştırma uygular Ekranda, içinde hiçbir şey olmayan alanların değerlerini alırken -tile. Bu nedenle, insanların renk tamponunu ve derinlik arabelleğini temizlemekten kaçınmak için kullandıkları eski hack, aslında modern GPU'larda performansı gerçekten incitiyor;) –

+0

Nedeni tam olarak ne düşündüğümdü :) Mükemmel ans. – 2am