Karmaşık bir 3D sahnede alfa harmanlama nasıl doğru şekilde uygulanır?


11

Bu sorunun cevaplanması biraz kolay gelebilir ama beni deli ediyor. İyi bir alfa harmanlama mekanizmasının işlemesi gereken çok fazla olası durum vardır ve her Algoritma için eksik bir şey olduğunu düşünebilirim.

Şimdiye kadar düşündüğüm yöntemler şunlardır:

  • Birincisi, derinliğe göre nesne sıralama hakkında olsa da, bu basitçe başarısız olur çünkü Nesneler basit şekiller değildir, eğrileri olabilir ve birbirlerinin içinde dönebilirler. Bu yüzden hangisinin kameraya daha yakın olduğunu her zaman söyleyemem.

  • Sonra üçgenleri sıralamayı düşündüm ama bu da başarısız olabilir, nasıl uygulanacağından emin olmadığımı düşündüm, iki üçgenin birbirinden geçtiği bir soruna neden olabilecek nadir bir durum var. Yine kimse hangisinin daha yakın olduğunu söyleyemez.

  • Bir sonraki şey derinlik tamponu kullanmaktı, en azından derinlik tamponuna sahip olmamızın ana nedeni, bahsettiğim sıralama ile ilgili problemlerden kaynaklanıyor ama şimdi başka bir sorun elde ediyoruz. Nesneler saydam olabileceğinden, tek bir pikselde birden fazla nesne görülebilir. Peki hangi nesne için piksel derinliğini saklamalıyım?

  • Sonra belki de sadece en ön nesne derinliğini saklayabileceğimi düşündüm ve bunu kullanarak o pikselde bir sonraki çizim çağrılarını nasıl karıştırmam gerektiğini belirledim. Ama yine bir sorun vardı, ortasında katı bir düzlem olan iki yarı saydam düzlem düşünün. Sonunda sağlam bir düzlem yapacaktım, en uzak düzlemi görebiliyordum. Bu piksel için yalnızca bir renk kalana kadar her iki düzlemi birleştireceğimi unutmayın. Açıkçası, yukarıda açıkladığım aynı nedenlerden dolayı sıralama yöntemlerini de kullanabilirim.

  • Son olarak çalışabildiğimi hayal ettiğim tek şey, tüm nesneleri farklı oluşturma hedeflerine dönüştürmek ve sonra bu katmanları sıralamak ve son çıktıyı görüntülemek. Ama bu sefer bu algoritmayı nasıl uygulayabileceğimi bilmiyorum.

Yanıtlar:


11

Kısa cevap

İçine bak derinlik soyma . Araştırmamdan, hesaplamalı olarak pahalı olmasına rağmen en iyi alternatif gibi görünüyor çünkü çoklu oluşturma geçişleri gerektiriyor. İşte NVIDIA tarafından da daha yeni ve daha hızlı bir uygulama .

Uzun cevap

Bu zor bir soru. Okuduğum çoğu kitap konuyu gözden kaçırıyor:

Tüm opak nesneleri oluşturarak başlayın ve üstündeki saydam nesneleri arkadan öne doğru karıştırın.

Daha kolay onların sentroidler göre sıralama nesnelerin bariz bir yaklaşım çünkü, gerçi bunu söylemesi değil doğru sıralama düzeni garanti.

Tam olarak aynı problem Ressamın algoritmasının genel durum için çalışmadığı ve bir derinlik arabelleği gerekli olduğu ile .

Bununla birlikte, sahip olduğum kitaplardan birinde birkaç çözümden bahsediliyor:

  • Derinlik Peeling - bize sadece en yakın olanı değil, en yakın parçaları vererek derinlik tamponu sınırlamasını aşan çok geçişli bir çözüm. En büyük avantaj, saydam nesneleri istediğiniz sırayla oluşturabilmeniz ve sıralamaya gerek olmamasıdır. Birden fazla geçiş nedeniyle pahalı olabilir, ancak bağlantı üstte verdiğim performansı arttırıyor gibi görünüyor.

  • Şablon Yönlendirilmiş K-Tamponu - Geometri geçişi başına piksel başına birden çok parça katmanını yakalamak için şablon yönlendirmesini kullanın. Ana dezavantaj, parçaların bir işlem sonrası geçişinde sıralanması gerektiğidir.

Ayrıca soruna bir donanım çözümünden bahsediyor, ancak aslında mevcut olduğunu düşünmüyorum:

  • F-Tampon - Çok Geçişli İşleme için Rasterizasyon Sırası FIFO Tamponu. Bununla birlikte, iyi bir okuma ve giriş, şeffaflık sıralama düzeni sorunu ve mevcut çözümler hakkında biraz konuşur.

Mükemmel sonuçlar vermeyen, ancak hiçbir şeyden daha iyi olmayan diğer geçici çözümler:

  • Tüm opak nesneleri oluşturduktan sonra, saydam nesneler için Z-buffer testini kullanmaya devam edin, ancak Z-buffer yazmayı devre dışı bırakın . Yanlış sıralamadan bazı eserler alabilirsiniz, ancak en azından tüm saydam nesneler görünür olacaktır.

Ve yukarıdaki F tamponlu teknik incelemeden alıntı:

En basit çözüm, kısmen saydam her çokgeni tamamen bağımsız hale getirmektir (yani, bir sonraki çokgene geçmeden önce tüm geçişlerini gerçekleştirmektir). Bu çözüm, gerçekleşen devlet değişim maliyeti nedeniyle genellikle oldukça pahalıdır. Alternatif olarak, uygulama veya gölgeleme kütüphanesi, yalnızca üst üste binmeyen çokgenlerin birlikte oluşturulmasını sağlamak için çokgenleri gruplandırabilir. Çoğu durumda bu çözüm de cazip değildir, çünkü yazılımın çokgenlerin ekran alanı analizini yapmasını gerektirir.


11

Doğru cevap # 1: tüm şeylerinizi derinliklerine göre sıralayın ve oluşturun (açıkçası derinlik yazmayı kapatın, ancak test etmeyin). "Şey" nedir?

Her "şey" bir dışbükey nesne olmalıdır; kendiliğinden üst üste binemez. İçbükey bir nesneniz varsa, bu nedenle dışbükey parçalara ayrılmalıdır.

Bu şeffaf sahneyi render standart bir yol. İç içe geçmiş vakaları çözüyor mu? Hayır. Derinlik sırasının belirlenemediği 3 nesnenin olduğu durumları çözüyor mu? Hayır. Merkez derinliğine daha yakın olan küçük bir nesneyle örtüşen uzun bir nesnenin olduğu vakaları çözüyor mu? Hayır.

Ama yeterince iyi çalışıyor . Oyunlar derinlik soyma kullanmaz. Şablon yönlendirmeli k-tamponları kullanmazlar. F-tamponları kullanmazlar. Neden? Çünkü bunlar inanılmaz derecede yavaş.

Standart yöntemle artefaktlar alabilirsiniz. Ama en azından oyununuz oldukça hızlı çalışıyor.

Kendinizi DX11 veya daha iyi bir donanımla sınırlamak istiyorsanız, uygun sıralama ile karıştırma yapmanın yolları vardır. Daha yavaşlar, ancak önceki teknikler kadar yavaş değiller. Ve artefaktları tanıtabilen derinlik soymanın aksine, bu örnek doğru. Ayrıca, algoritmanın performansı genellikle parça başınadır (ve her parça içindeki çakışma başına bir dereceye kadar). Bu yüzden çok fazla şeffaf malzeme çizmediyseniz, performans minimumdur.

Tekniğin şık bir adı olup olmadığını bilmiyorum, ancak GL4.2 öncesi için bir uygulama burada bulunabilir. Burada bir D3D11 sürümü bulunabilir (Powerpoint, PPSX, Libre uyumlu).


Bu cevapta iyi puanlar. Ben de listelediğim tekniklerin çoğu muhtemelen değerinden daha fazla sorun olduğu gibi ben de (ki benim cevap, bir geçici çözüm olarak tarif) yeterince iyi yerleşir . Ayrıca, sonunda ilginç bir teknik, cevabımı araştırdığım Gerçek Zamanlı Rendering'de listelendiğini sanmıyorum . DX11 seviye özellikleri söz konusu olduğunda tam bir çaylağım.
David Gouveia

"GL4.2 öncesi için bir uygulama burada bulunabilir" 404
Jeroen van Langen
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.