Katmanlı alfa dörtlü kullanarak zemin sisinin uygunluğu?


16

Katmanlı bir yaklaşım, zemine paralel olarak düzenlenmiş ve araya giren tüm arazi geometrisiyle kesişen bir dizi büyük alfa dokulu dörtlü kullanır, bu da sisin yukarıdan aşağıya doğru bakıldığında, aşağı doğru bakıldığında ve biraz daha az etkili bir şekilde sis ve Ufka doğru bakarken (aşağıdaki resme bakın).

Alternatif olarak, öncelikle gölgelendirici tabanlı bir yaklaşım, bunun yerine, yoğunluğu, yer sisi substratına görüş mesafesi fonksiyonu olarak hesaplar ve buna göre parça değerini çıkarır.

Her yaklaşımı kendim test etmek zorunda kalmadan , önce katmanlı alfa doku yaklaşımının ne tür bir performansa sahip olabileceği konusunda başkalarının deneyimlerini (spekülasyon değil!) Duymak isterim . Özellikle aşırı çekimin atıfta bulunulan etkileri nedeniyle soruyorum (ortalama masaüstü sisteminizin doluluk oranının nasıl bağlı olduğundan emin değilim). Bu yaklaşımı kullanan oyunların bir listesi, özellikle de eski oyunlar, son derece yararlı olacaktır: bu, DX9 / OpenGL2 öncesi donanımlarda geçerliyse, benim için iyi çalışması muhtemeldir.

Büyük bir soru bu tür etkilerle ilgili:

resim açıklamasını buraya girin

(Resim kredisi lume.com Lume'a gider)

Dikey sis geçişinin nasıl sürekli / pürüzsüz olduğuna dikkat edin. OTOH, dokulu dört katmanları kullanarak, sadece katmanların içinden geçerken çok açık olacağını varsayabilirim - ne kadar seyrek olursa, o kadar açık olur. Bu, sis düzlemlerinin oyuncuya her kareyle yüzleşmek için hizalandığı yerin aksine, bu kalınlığın çok daha az belirgin olacağı yerdir.


1
Bunun için neden alfa dörtlü katmanları kullanmak istersiniz ? "Gölgelendirici-ağır yaklaşım" sadece daha doğru olmakla kalmaz, aynı zamanda yavaş olduğu da tam olarak bilinmemektedir .
Nicol Bolas

1
@StephanvandenHeuvel Elbette, ancak bu, görüş alanına göre hizalanmış, mesafeye dayalı bir sis. Yere hizalanmamış sis. Doğru?
Mühendis

1
@NickWiggill Evet, haklısın.
Stephan van den Heuvel

1
IIRC'de, Wii'nin (yarı) sabit boru hattında yere hizalanmış bir sisi vardı. Görünüşe göre glFogCoordeski OpenGL'deki uzantı da bunu yapmaya izin verdi . Sınırlı görünse de, yere veya mesafeye dayalıdır.
Laurent Couvidou

1
Quake 3, GL1.1 ile çalışan sabit bir boru hattı yaklaşımı kullanarak buna benzer bir şey yaptı. Sahip olduğum en büyük endişe, doldurma oranı / geri çekme kötü bir şekilde yığılabilir, ancak muhtemelen Q3 kaynak kodunu indirmeye ve uygulamalarını gözden geçirmeye değer; aynısını yapamayabilirsiniz ama en azından karar vermenize yardımcı olabilir.
Maximus Minimus

Yanıtlar:


15

Deneyim istediğin için, işte benim.

PS2 oyunlarını programladığım günlerde, "katmanlı alfa dörtlü" yaklaşımı sık sık sis uygulamamızın bir yoluydu. Bazen yer sisi olarak, ancak daha yaygın olarak tam ekran sisi olarak kullanılır. Ve her iki durumda da gayet iyi çalıştı. Yani evet, fragman öncesi gölgelendirici günlerinde uygulanabilirdi.

İyi sıralama. Sorun, belirttiğiniz gibi, ekran görüntüsünde görülen gibi yumuşak bir sis istiyorsanız, oldukça sayıda alfa dörtlü almanız gerektiğiydi.

PS2'de genellikle üç ila beş katman arasında bir yer alabiliriz. Hangi kesinlikle önünüzde yüzen sis "duvarları" gibi görünüyordu. Bundan daha fazla ve doluluk oranı kare hızımızı öldürmeye başladı.

Normalde, bu dörtlüler kameranın önündeki sabit mesafelerde çizilirdi, bu yüzden bahsettiğiniz duruma hiç bir zaman "girmeden" giremezsiniz. Öte yandan, bu sabit mesafeler kullanılarak, dünyadaki her şey yaparoyuncu hareket ettikçe bu uçaklardan geçmek, bu oldukça açık bir grafik aksaklık. Neredeyse herkes o zamanlar yaptı, ama şimdi kabul edilemezdi (stilistik nedenlerle yapmazsan). (İstisna: Bazı insanlar, PS2'nin bir tepe gölgelendiriciye eşdeğer bir parçası olarak sis değerlerini hesapladı. Bu işe yaradı ve çok daha hızlıydı, ancak modellerinizin yüksek derecede yorulmasını gerektiriyordu. Örneğin, uzun duvarlara sahip olamazdınız, çünkü sis sadece duvarın köşelerinde hesaplanıyor ve daha sonra duvarın tüm yüzüne sürülüyor ... Örneğin, ortadaki sis seviyesinin hemen yanında duruyorsanız, duvar tamamen sisli görünüyordu. bitiş noktaları)

Sis dörtlerini statik olarak dünyaya yerleştirirseniz (bir olasılık olarak belirttiğiniz gibi), sağladığınız görüntüde olduğu gibi son derece pürüzsüz bir sis görünümü elde edemeyeceğinizi unutmayın - arasında garip çakışmalar olacaktır. bitişik dörtlüler izleyicinin yönüne göre değişir. Bu örtüşmeler çizgiler veya yamuklar (dörtlüler dokusuz ise) veya topaklar (dokulu ise) olarak görünebilir.

Ancak diyelim ki, bu zemin sisini yapmak için geniş, ekrana bakan dörtlüler kullandığımızı ve bu yöntemi kullanarak düz bir zeminde, bir kamera ileriye baktığımızda gerçekten pürüzsüz bir sisin nasıl yapılacağı için bazı hesaplamalar yaptığımızı varsayalım - bu bizim ideal durumumuz . Ufkumuzu tarama çizgisi 540'a koyan HD çözünürlüğü: 1920x1080'i varsayalım. Ufuk çizgisine kadar görünürlüğümüz olduğunu varsayalım (ufka ulaşmadan önce siste tam opaklığa ulaşmadığınızı varsayarak). Her sis çizgisinde bir sis dörtlü başlatma ve bir durma (yumuşak sis elde etmek için) için (540 * 2 ==) 1080 sis dörtlü gerekir. Bu 1080 sis dörtlünden her biri ekranın tüm yatay genişliğini kaplayacak,

Düşük tahmin edelim ve ortalama olarak bir sis düzleminin yaklaşık 300 satır pikseli kapsayacağını varsayalım. En yakın olanlar daha az kapsayacak, en uzak olanlar daha az kapsayacak, orta sıralar çok daha fazla kapsayacak.

Bu tahminle ortalama sis dörtlüsü tarafından (1920x300 ==) 576.000 piksele ulaşılıyor. Toplamda, (576.000 * 1080 ==) "Çok saydam geometri oluşturarak pürüzsüz sis" efekti için toplam 622.080.000 piksele dokunuluyor. Ve bu sayı daha yüksek çözünürlükte çalışan insanlar için artacaktır. Dahası, z tamponuna karşı aynı sayıda test ve neredeyse aynı sayıda piksel harmanlama işlemi yapıyoruz, çünkü tüm bu şeffaf katmanlar birbirini tekrar tekrar çiziyor. Bu çok fazla piksel.

Ve bu en iyi senaryo - kullanıcı aşağı bakar ya da çökerse, sis dörtlülerinin ekran kapsamı çok daha fazla olur.

1080 dörtlü üst üste geldiğimizden, her birinde yaklaşık (1.0 / 1080 ~ =) 0.0009'luk bir alfa değeri ayarlamak istediğimizi unutmayın, böylece tüm 1080 dörtlü bakarsanız sisimiz tam opaklığa ulaşır. (Bundan daha yükseğe gidebiliriz, ancak bu, aralığı olabildiğince yaymak istediğimizi varsayan değerdir). Bu değerin 32 bit renk değerinin alfa bileşeni olarak temsil edilemeyeceğini unutmayın (256 * 0.0009 ~ = 0.237 ve denerseniz denerseniz 0'a yuvarlanır). Çalışması için 0.0009 değerini bir kayan nokta değeri olarak OpenGL'ye vermeniz gerekir. (Ayrıca, her birine aynı değeri ayarlamak istemeyeceğinize dikkat edin - bize düzgün bir sis vermek için bir dörtlü başlamamızı ve bir ufkun altındaki her tarama çizgisinde bitmesini istediğimizi belirledik,

Ayrıca, sis karışımlarının modern bir gölgelendiricide olduğu gibi bu yaklaşımı kullanarak tam olarak çalışmadığını unutmayın - "temel nesne rengi ile bu yüzde kullanarak sis rengi arasındaki karışım" için bir hesaplama almak yerine 1080 elde edersiniz. "şimdiye kadar renk ve sis rengi arasında sis yüzdesine göre karışım" hesaplamaları. Bu, sisin logaritmik bir serpinti sonrasında nesneleri etkileyeceği anlamına gelir. (Yani, 20 sis dörtlüsünden etkilenen bir nesne, 10 sis dörtlüsünden etkilenen bir şeyin iki katı kadar sisli görünecektir, çünkü ilk sis dörtlüsü karıştırma işleminde daha fazla etkiye sahiptir).

Bunların hepsi: Lütfen sadece bir parça gölgelendirici kullanın.

Hayır, gerçekten. Uygulanması daha basit, daha ucuz ve daha hızlı ve daha hızlıdır ve hataya daha az eğilimlidir ve oyununuzu gerçekten yapmaya geri dönmenizi sağlar ve mümkün olan her şekilde daha iyidir. O zamanlar bile belirsiz bir şekilde mümkün olsaydı, PS2 döneminde tamamen geri yapmış olurduk.


1
Gerçek dünya deneyimine dayalı kapsamlı cevap için +1.
concept3d

3
Bir yıl ve bir ay önce bu soruyu yazdığımda, hala doldurma oranlarıyla tavuk oynamaya hazırdım. Şimdi , 3D perlin gürültüsü tarafından belirlenen sürekli değişen yoğunluklara sahip zemin sis hacimlerini temsil etmek için kaba bir 3D doku tercih ettim ve sonra bunu önerdiğiniz gibi ekran alanı efektleri için bir temel olarak kullanacağım.
Mühendis
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.