OpenGL'de bir derinlik arabelleğinin derinlik aralığını nasıl bulabilirim?


11

İOS için bir GL çok geçişli oluşturma uygulaması yapıyorum. İlk geçiş derinlik tamponu dokusuna dönüşür. İkinci geçiş, bir parça gölgelendiricinin uygulanmasını kontrol etmek için derinlik tamponundaki değerleri kullanır. Derinlik arabelleğindeki değerleri faydalı bir şeye yeniden ölçeklendirmek istiyorum, ancak bunu yapmadan önce derinlik arabelleği değerlerinin derinlik değeri aralığını bilmem gerekiyor. Bunu nasıl yaparım?

Yanıtlar:


10

Derinlik arabelleğine yazılan değerlerin aralığı, olmasını istediğiniz her şeydir. Tipik olarak 0 ila 1 aralığındadırlar. Derinlik arabelleğine yazılan gerçek değer, görünüm alanı dönüşümü sırasında, NDC uzayındaki tepe noktasının Z değerine göre (perspektif, klip uzayında w'ye bölündükten sonra) hesaplanır.

NDC derinlik değeri (Z, perspektif bölü W ile bölündükten sonra) görünüm alanı dönüşümünün derinlik bölümüne göre ölçeklendirilir (X ve Y koordinatlarınızı penceredeki piksellerle ilişkilendireceğiniz bir koordinat alanına getirir) ve ardından ölçeklendirilir (2^n-1)- bu, "gücünün ikisine" olarak okunması gerektiği anlamına gelir n- nderinlik tamponunun bit hassasiyeti. Ortaya çıkan değer derinlik arabelleğine yazılır.

OpenGL, görünüm alanı dönüştürme matrisinin tanımını glViewport ve glDepthRange çağrılarına böler . glDepthRange, sormak istediğiniz derinlik aralığını belirlemekten sorumlu ölçek faktörünü kontrol eden şeydir. Sen diyebilirsin glGetFloatv ile GL_DEPTH_RANGEşimdiki aralığını kurtarmak için selektör. Bu, aralığı 0 ila 1 olduğunu varsaymadan kullanmanıza izin verecektir (zamanın% 99,9'u pratikte hiç kimse değiştirmez).

Göz boşluğundan derinlik arabelleğine kadar Z değerini takip etmek için matematiğin nasıl yeniden yapılandırılacağına dair bir fikir edinmek isterseniz daha fazla okuma.


Bunu tüm ek referans materyalleri için Josh'a vereceğim ve üçgen düzlemselliği hakkında ipucu vereceğim. Derinlik haritasının güzel değerlere sahip olması için oluşturduğum geometrinin z-boyutuyla tam olarak eşleşecek şekilde yakın / uzak klip düzlemleri olan bir kesmek yapmaya meyilliyim. Ben ne yapıyorum? 1 numaralı geçiş sırasında, # 1 numaralı derinlik haritasında ne olduğuna bağlı olarak ilginç yere özgü bulanıklık efektleri oluşturmak istiyorum.
dugla

7

Derinlik arabelleğindeki değerler her zaman 0-1 arasındadır. Sıfır, oluşturulan parçanın yakın düzlemin derinliğinde ve 1 parçanın uzak düzlemin derinliğinde olmasıdır. Ve aralarındaki her şey.

Dünya uzayında gerçek derinliği bilmek istiyorsanız, derinlik tamponundan hesaplamak kolaydır.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Bu nedenle, derinlik tamponunun daha fazla doğruluğunu elde etmek için projeksiyon matriğinizdeki yakın ve uzak düzlemleri belirtirsiniz.

Ayrıca derinlik arabellek değerlerini kullanırken derinlik ve mesafe arasındaki farkın farkında olun.


@notebene. Neredeyse. Derinlik tamponundaki değerlerin aralığını tam olarak 0 -> 1 olarak yeniden ölçeklendirmek istiyorum. Böylece, oluşturulan min / maks derinlik değerleri .25 / .75 ise (derinlik değeri - .25) / (. 75 - .25). Yani, 1. pasayı takiben deepbuffer'ın min / maks değerini keşfetmenin ve 2.
paso

1
@dugla: düzlemsel olan üçgenler oluşturduğunuzdan, minimum ve maksimum derinlik değerlerinin performansının sahnedeki minimum ve maksimum köşelerle ilişkilendirilmesi gerekir. Bu ikisini biliyorsanız, bunları boru hattı boyunca manuel olarak dönüştürebilirsiniz ve derinlik arabelleğine yazacağınız minimum ve maksimum değerleri bilirsiniz. Bu, oluşturma işleminden, daha sonra tüm derinlik arabelleğini okuyup yinelemekten daha kolaydır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.