Tesadüf yüzeyleri ile z mücadelesinden kaçınmak


26

Üst üste binen iki düzlemsel yüzey oluştururken, ortak bir sorun "z-dövüş" olup, işleyicinin iki yüzeyden hangisinin kameraya daha yakın olduğuna karar vermesi, üst üste binme alanında görsel eserler vermesidir.

Bunun için standart çözüm, modeli tasarlarken yüzeylere hafif bir kayma sağlamaktır. başka bir çözüm var mı?


2
Logaritmik derinlik tamponlarını kontrol edebilirsiniz. Gamasutra'da
Soapy

1
"Eş düzlemsel" derken, "neredeyse" veya "tam olarak" eş düzlemsel anlamına mı geliyorsunuz ve ikincisi ise, bu yüzeyler aynı yüzeyler / üçgenler midir? Rendering donanımı, son durum için belirleyici olmalı (rastgele sıraya girmediğinizi varsayarak) ve mücadele etmemelidir. Aynı olmayan yüzeyler ancak tam olarak düzlemsel bir durum varsa, modeli yüzeyleri üst üste binen ve üst üste binmeyen kısımlara bölecek şekilde güncelleyebilir misiniz?
Simon F,

@SimonF, "ortak düzlemsel" ile "aynen ortak düzlemsel" demek istiyorum. Soapy'nin çözümü sadece “neredeyse eş düzlemsel” durumda işe yarıyor.
Mark

Yüzeylerinize bir örnek verebilir misiniz? Kafamın üstünden düşünebildiğim tek şey @SimonF'un bahsettiği gibi yinelenen üçgenler.
RichieSam'lar

@RichieSams, tam olarak yinelenen üçgenlere ihtiyaç duymadığınız, düşünebileceğiniz en yaygın vaka.
rys

Yanıtlar:


10

Yüzeyler tam olarak ortak planlayıcı ise, kaderiniz FPU tanrılarına kalmış; Muhtemelen Z savaşı yapacaksın. Üçgenler aynıysa ve her birine tam olarak aynı matematiği yaparsanız , her ikisi için de aynı Z değerlerine sahip olursunuz . Fakat yine de, bu yalnızca matematik işlemleriniz her ikisi için de aynı olduğunda gerçekleşir. (Genel olarak, FPU işlemleri değişmeli olmadığından)

Olası bir çözüm, Z-tamponunu hiç kullanmamaktır. Aksine, Ressam Algoritmasını kullanabilirsiniz . Verilen, bu ressam algoritması tüm sorunları ile birlikte geliyor. Ancak, Z-dövüşünü çözerdi.

Örnek Ekran Uzay Çıkartmaları (SSD'ler) örneğinde ortak çözüm ofset, yani basit bir ince küp kullanmaktır. Referans için Warhammer 40k'ın SSD'ler hakkındaki sunumuna bakınız . Ya Bart Wroński'nin sonrası da çıkartmalar ile diğer bazı sorunları giderir, ama SSD'ler hakkında birkaç diğer sunumlar bağlantılar


5
Aynı geometriyi aynı dönüşümlerle tekrar oluşturmak, her seferinde aynı derinlik değerlerini güvenilir şekilde üretir. (Yani bu bir güç değil , bir irade ). Mesela çoklu geçişli ileri aydınlatma çalışmalarının nedeni budur.
Nathan Reed,

@NathanReed Düzeltildi. Açıklama için teşekkürler
RichieSams

1
Bu işlevselliği elde etmek için, glsl'deki
ashleysmithgpu 10:15

Köşe konumlarını değerlendirirken aynı gölgelendirici ifadelerinin (ve tabii ki girdilerin), bazı optimizasyonların gölgelendiricinin geri kalanına bağlı olabileceğinden aynı sonuçları elde etmek için yeterli olmayabileceğini unutmayın. GLSL, farklı gölgelendiricilerde aynı şekilde değerlendirilmesi gereken gölgelendirici çıktılarını bildirmek için "değişmeyen" anahtar sözcüğe sahiptir.
Firadeoclus

2

İşte bunu geçmişte nasıl çözdüğüm:

  1. Derinlik testi ama ilk nesne (başka bir nesnenin arkasına görünmelidir bir) çizin değil derinlik yazı
  2. İkinci nesneyi derinlik testi ve derinlik yazarak çizin. Bu, z-dövüşüne neden olmayacak çünkü 1. adımda hiçbir derinlik yazmadık.
  3. İlk nesneyi renk arabelleğine değil , yalnızca derinlik arabelleğine yazarak çizin . Bu, derinlik arabelleğinin nesne 1 tarafından kaplanan ancak nesne 2 tarafından kaplanmayan pikseller için güncel olmasını sağlar.

Bunun çalışması için nesnelerin ardışık olarak çizilmesi gerekir.


0

Oluşturucunuza bağlı olarak, yüzeyleri daha "bulanık" hale getirerek, çoklu örnekleme derinliğinde bir minik ofset uygulayarak bir gürültü benzeri algoritma kullanarak yapabilirsiniz. Bu, yakın derinlikteki yüzeyler için bir çeşit karışım etkisine neden olmalıdır. Bildiğim için, parça gölgelendiricideki numune başına derinliği ayarlama OpenGL'de oldukça yeni ve sonra sadece bir uzantı olarak.

OpenGL PolygonOffset'e sahiptir, ancak önceden bir şey yapmak üzere olduğunuzu bilmenizi gerektirir. Tek bir modeldeki yüzeyler için uygun olmamakla birlikte, örneğin bir toprak parçasının üzerine döşenmiş bir yol çizilirken güzel bir şekilde çalışabilir.

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.