Kafes gizlendiğinde / nerede işlendiğinde sonradan işlenmiş bir kafes anahat nasıl gizlenir


11

3D motorumda etkin bir anahat, seçilen 3d karakterler için bir vurgu efekti veya ekranda manzara oluşturmak için çalışıyorum. Şablon arabelleği ile çalıştıktan ve tatmin edici olmayan bazı sonuçlar elde ettikten sonra (içbükey şekillerle ilgili sorunlar, kameradan uzaklığa bağlı anahat kalınlığı ve masaüstü ve dizüstü bilgisayarım arasındaki tutarsızlıklar), kenar algılama ve çerçeve tamponu örneklemesine geçtim ve bir anahat aldım oldukça memnun.

Ancak, seçilen ağ başka bir ağın arkasındayken anahattı gizleyemiyorum. Bu, benim sürecim göz önüne alındığında mantıklı, çünkü sahnenin geri kalanını oluşturduktan sonra bir çerçeve arabelleğinden 2d gölgelendirici anahat çiziyorum.

Sonuçlarımın iki ekran görüntüsü aşağıda. Birincisi, "iyi" bir çerçevedir, ikincisi, çerçevenin, anahat kaynağını engelleyen bir kafes üzerinde görüldüğü yerdir.

resim açıklamasını buraya girin

Oluşturma işlemi şu şekilde çalışır: 1) Vurgulanan kafesin alfa'sını çizin, bir çerçeve arabelleğinde (framebuffer1) siyah bir siluet yakalayın.

2) Dokuyu çerçeve tamponundan1 kenar algılamayı yapan ikinci bir gölgelendiriciye geçirin. Çerçevedeki kenar yakala 2.

3) Tüm sahneyi işleyin.

4) Sahnenin üstündeki framebuffer2'den doku oluşturun.

Nasıl yapılacağına dair birkaç fikrim var ve geçerlilikleri hakkında veya daha basit veya daha iyi yöntemlerle ilgili geri bildirim almayı umuyorum.

İlk olarak, tüm sahneyi bir çerçeve arabelleğine oluşturmayı ve vurgulanan ağın görünür siluetini alfa kanalında saklamayı düşündüm (tüm beyaz vurgulanan ağın görünür olduğu yerde saklanır). Daha sonra alfa kanalında kenar algılamayı gerçekleştirir, sahne çerçevesi arabelleğini oluşturur ve daha sonra kenarı üste getiririm. Bunun gibi bir şeyle sonuçlanır:

sonuç

Bunu yapmak için, yalnızca herhangi bir görünür piksel için alfadaki tüm siyahı çizecek olan vurgulanan nesnenin render geçişi sırasında bir tanımlamayı ayarlamayı düşündüm.

İkinci fikrim, yukarıda özetlenen geçerli oluşturma işlemini kullanmak, ancak seçilen kafesin silueti oluşturulurken X, Y ve Z koordinatlarını framebuffer1'in R, G ve B kanallarında saklamaktır. Kenar saptamaları framebuffer2 içinde yapılacak ve saklanacak, ancak alfa kenarlarından silüete RGB / XYZ değerlerini ileteceğim. Sonra, sahneyi oluştururken, koordinatın framebuffer2 içinde saklanan kenar içinde olup olmadığını test ederdim. Eğer öyleyse, o zaman RGB parçasından (kamera boşluğuna dönüştürülmüş) çıkarılan koordinatların önünde mi arkasında mı olduğunu belirlemek için mevcut parçanın derinliğini test ederim. Eğer parça derinlik koordinatlarının önündeyse, parça normal şekilde oluşturulacaktır. Eğer parça arkasındaysa, düz anahat rengi olarak işlenir.

Bu proje için LibGDX kullanıyorum ve WebGL ve OpenGL ES'yi desteklemek istiyorum, bu nedenle geometri gölgelendiricileri veya daha yeni GLSL işlevlerini içeren çözümlerin hiçbiri benim için mevcut değil. Eğer biri önerilen yaklaşımlarım hakkında yorum yapabilir ya da daha iyi bir şey önerebilirse, bunu gerçekten takdir ediyorum.


Reponuza bir göz attım. Hiç kabul edilebilir bir çözüm buldunuz mu?
iKlsR

Yanıtlar:


0

Biraz ayarlamak ve bit atmak / kaldırmak için başka bir şey için istenen anahatlı nesne ile bir şablon tampon içine tüm sahne render.

Ardından kenar algılamasından kurtulun, buna ihtiyacınız yok, bunun yerine tamponu biraz ölçeklendirebilirsiniz. Böylece her nesne biraz büyür.

Oradan şablon tampon ihtiyacınız olan anahat olabilir. Her şey, oluşturduğunuz diğer nesnelerin şablon tamponunuzdaki bitleri kapattığından emin olmakla ilgilidir.


2
Yanıtınız için teşekkürler. Ölçekleme 3 boyutlu olarak yapılırsa, bu yöntem anahat kalınlığı ve içbükey şekillerle benzer sorunlarla karşılaşmaz mı? Veya 2d'de yapıldıysa ve anahatları belirlenmiş nesne ekranın ölü merkezinde değilse, yer değiştirme sorunları?
nils

0

1) bir çerçeve tampon nesnesinde, konturu elde etmek için GPU'da bir laplacian gölgelendirici çalıştırabilirsiniz.

2) nesnenizi FBO'da çizdiğinizde son derinlik arabelleğini kullanmanız gerekir, böylece FBO'da nesnenizin yalnızca görünür kısmını çizersiniz ve laplacian sadece görünür kısmı çizer.


Merhaba, cevap için teşekkürler. Bunu zaten ana hatlara ulaşmak için yapıyorum. Yine de bu cevap için bir aşağı oy hak ettiğini düşünmüyorum, bu yüzden yukarı doğru.
nils

0

Umarım bunu açıklığa kavuşturabilirim, ancak temel olarak her iki nesnenin de her ikisi de seçili gibi bir şablon yapmanız gerekir, o zaman sadece vurgulamak istediğiniz öğenin sınırlayıcı kutusundaki alanları saklayın.

Yani temelde, her iki nesnenin de bir şablon tamponu yaparsınız (veya nesneyi tıkayan tüm nesneler, gerçekten ... ama aslında çok fazla olmadıkça bu durumlar için endişelenmeyeceğim - eğer tıkanmış insanlar beklemiyorsa bu kadar yardımcı), ve sonra nesneniz için sınırlayıcı kutunun bir şablonuyla.

Bu, aradığınız etkiyi elde etmelidir.

Alternatif olarak sadece 'kötü' sonucu bırakabilirsiniz ve verilerinizin / oyununuzun ve özellikle nesnelerin boyutuna bağlı olmasına rağmen çoğu insanın çok fazla umursamayacağını sanmıyorum.

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.