OpenGL'de saydamlık oluşturmanın bazı yöntemleri nelerdir?


14

Alfa harmanlama, yüzeyleri saydam hale getirmek için şu şekilde açılabilir:

glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Ancak bu yalnızca nesneler önden arkaya oluşturulursa çalışır. Aksi takdirde, arka plandaki şeyler, aşağıdaki görüntüdeki zemin gibi daha yakın nesnelerin önünde görünür. Parçacıklar ve GUI öğeleri için sıralama iyi olurdu, ancak üçgen kafesler için burada tartışıldığı gibi çok fazla çaba ve yavaş gibi görünüyor: https://www.opengl.org/wiki/Transparency_Sorting .

Bununla başa çıkmak için ortak yöntemler nelerdir? Bunun oldukça geniş olduğunu ve derinlemesine uygulama detaylarından sonra olmadığını, bazı yaklaşımların ve nelerin dahil edilebileceğinin kısa bir tanımını biliyorum.

resim açıklamasını buraya girin


Bunun bir cevap olarak gidip gitmeyeceğinden emin değilim, ancak resminizdeki hatalara tüm ilkellerde derinlik testi yapılmadan oluşturma neden oluyor . Sahneyi 2 geçişte oluşturmalısınız: İlk önce normalde tüm katı geometriyi oluşturun. Daha sonra, derinlik yazmalarını devre dışı bırakın (GL_DEPTH_TEST değil) ve yarı saydam geometriyi kabaca arkadan öne doğru sıralayın. Bu, saydam geometrinin önündeki katı geometrinin önüne çizilmemesini sağlayacaktır.
yuriks

@yuriks Bu durumda, muhtemelen benim açımdan kötü bir örnek, ama her şeyin şeffaf olması gerekiyor. Kötü yapıldığında şeffaflığın ne kadar yanlış görünebileceğini göstermek için bir şey istedim. Ayrıca sıralama geometrisinin inanılmaz derecede zor olacağı bir örnek (örneğin, zemin bir dev çokgendir ve tüm derinlik aralığını kapsar).
jozxyqk

Yanıtlar:


11

Açık sipariş vermekten kaçınmak için bir dizi teknik, Bağımsız Şeffaflık Düzeni (kısaca OIT) adı altındadır.

Çok sayıda OIT tekniği vardır.

Tarihsel olarak biri Derinlik Peeling . Bu yaklaşımda ilk önce en öndeki parçaları / pikselleri oluşturursunuz, daha sonra bir önceki adımda bulunana en yakın olanı bulursunuz ve böylece istediğiniz kadar "katman" ile devam edersiniz. Derinlik soyma olarak adlandırılır, çünkü her geçişte bir derinlik katmanı "soyulur". Tüm katmanınız normalde arkadan öne doğru birleştirilebilir. Bu algoritmayı uygulamak için derinlik arabelleğinin bir kopyasına sahip olmanız gerekir.

Diğer bir dizi teknik OIT karışımıdır. En yeni ve ilginç olanlardan biri McGuire ve Bavoil tarafından önerilen Ağırlıklı Harmanlanmış OIT'dir . Temelde belirli bir parçayı kaplayan tüm yüzeyler için ağırlıklı bir toplam uygular. Teklif ettikleri ağırlıklandırma şeması, kamera alanı Z (tıkanmaya bir yaklaşım olarak) ve opaklığa dayanmaktadır.
Fikir şu ki, sorunu ağırlıklı bir tutara indirebilirseniz, sipariş vermeyi gerçekten önemsemezsiniz.

Orijinal belge dışında, Ağırlıklı Harmanlanmış OIT'nin uygulama detayları ve sorunları için mükemmel bir kaynak Matt Pettineo'nun blogunda yer almaktadır . Görevinden de görebileceğiniz gibi bu teknik gümüş bir kurşun değildir. Ana sorun, ağırlık şemasının merkezi olması ve sahnenize / içeriğinize göre ayarlanması gerektiğidir. Deneylerinden, teknik nispeten düşük ve orta opaklık için iyi çalışıyor gibi görünse de, opaklık 1'e yaklaştığında başarısız olur ve bu nedenle yüzeyin büyük bir kısmının opak olduğu malzemelerden kullanılamaz (yeşillik örneğini yapar).

Yine, hepsi derinlik ağırlıklarınızı nasıl ayarladığınıza iner ve kullanım durumlarınıza mükemmel uyanları bulmak her zaman önemsiz değildir.

Ağırlıklı Karıştırılmış OIT için ihtiyaç duyulan şeylere gelince, fazladan iki fazladan hedef oluşturmaz. Önceden çarpılmış alfa rengi (renk * alfa) ve alfa ile doldurduğunuz, her ikisi de buna göre ağırlıklandırılır. Diğeri ise sadece ağırlıklar içindir.


6

Bir seçenek derinlik soyma kullanmaktır.

Esasen, sahnenin en yakın parçalarına nen yakın, en yakın, en yakın olanı belirlemek için sahneyi belirli sayıda (örneğin, kez) işler n.

Bu işleme ilk olarak tüm sahneye (doğal olarak en yakın yüzeyi döndüren) düzenli bir derinlik testi uygulanarak yapılır. Daha sonra, derinlik testinin sonucunu, derinlik testinde döndürülenden daha az derinliğe sahip her şeyi göz ardı ederek ilk katmanı filtrelemek için kullanır.

Derinlik testinin tekrar uygulanması ikinci katmanı döndürür. Gerektiği kadar tekrarlayın.

Katmanlara sahip olduktan sonra, katmanları önden arkaya doğru olduğu için normal olarak karıştırarak tüm katmanları ters sırayla çizebilirsiniz (her katman için RGBA renklerini takip ettiğiniz varsayılarak).


1
Teşekkürler! Bunun için iki derinlik tamponuna ihtiyacım var gibi görünüyor. Biri son derinlikleri saklamak ve filtrelemek, diğeri ise mevcut render için derinlik testini yapmaktır. Yanlışsam beni düzeltin ama her soyma geçişi arasında değiştirdiğim FBO için iki derin dokuya ihtiyacım olacağını varsayalım.
jozxyqk

1
@jozxyqk Doğru, bu prosedür için iki derinlik tamponu gereklidir.
es1024

1

Tek geçişli (veya az sayıda) creme de la creme, OpenGL'deki saydamlığı tehlikeye atar bir A-tamponudur. Modern OpenGL ile aşağıdakileri uygulamak mümkündür:

http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html

Derinlik soymanın çoklu geçişini önler ve zahmetli sıralama gerektirmez.


3
İdeal olarak, cevaplar müstakil olmalı ve hayati derecede dış bağlantılara bağlı olmalıdır. Bağlantılara sahip olmak ek materyaller için iyidir, ancak bir yanıt yalnızca bir anahtar kelimeden oluşmamalıdır. A tamponunun ne olduğu ve nasıl çalıştığı hakkında bazı ayrıntılar ekleyebilmeniz, cevabınızı büyük ölçüde geliştirecektir.
Martin Ender
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.