Piksel gölgelendiricileri neden doğrudan çerçeve tamponundan veya derinlik arabelleğinden okumamıza izin vermiyor?


18

Piksel gölgelendiricisindeki çerçeve arabelleği veya derinlik arabelleğini örneklememe izin vermek son derece kullanışlı bir özellik olacaktır. Mevcut pikselin arkasındaki şeyin derinliğini veya rengini bile bilmek faydalı olabilir.

Hem OpenGL hem de DirectX neden bunu yapmama izin vermiyor? Bir tür donanım sınırlaması olmasını bekliyordum, ancak alfa harmanlama, hesaplamaları karıştırmak için framebuffer'daki rengi kullanıyor ve Z-testi mevcut konumdaki derinlik tamponunu örnekliyor. Neden bu değerleri doğrudan bize açıklamıyorsunuz? Bunu gelecekte görmeyi umabilir miyim?

Yanıtlar:


20

Bu ise , bir donanım sınırlaması. Parça gölgelendirici programlanabilir boru hattının bir parçasıdır, ancak hedef tampon (lar) ile son renk karışımı bu noktada yaygın olarak kullanılabilir / emtia donanımında programlanamaz (karışım durumlarıyla yapılandırılabilir, ancak rastgele yazamazsınız) GPU'ların yerleşik karışım işlemlerinin yerini alan kod).

Donanımın bunun için yapılmamasının nedeni muhtemelen GPU'nun büyük ölçüde paralel olması gerçeğiyle ilgilidir; aynı anda birçok parçayı işliyorlar. Bu fragmanlardan bazıları nihai olarak hedef tamponlar içinde birbirleriyle etkileşime girebilir, ancak fragman işlemenin eşzamansız doğası nedeniyle, fragman işleninceye ve son renk yayılıncaya kadar nasıl olacağını bilmek mümkün değildir ... her zaman deterministik olarak olmaz.

A pikselinin son karedeki B pikselinin arkasında olması, A pikselinin her zaman parça işlemeyi tamamlayacağı ve özellikle birden çok oluşturma karesinde B'den önce hedefe yazılacağı anlamına gelmez. Bu nedenle, piksel B'nin işlenmesi sırasında hedef tampondan okunan değer her zaman piksel A olmaz - bazen net değerler olur.

Bu nedenle, fragman aşaması sırasında doğrudan hedef arabellek okumalarına izin verilmemesinin, karıştırma aşamasını tamamen yapmadaki herhangi bir teknik sınırlamadan potansiyel olarak belirsiz olmayan sonuçlar elde ederek gölgelendirici programlayıcısının ayaktan vurmasını engellemekle çok daha fazla ilgisi olduğunu düşünüyorum. programlanabilir. GPU, okuma işlemlerini sıkı bir şekilde kontrol altında tutarak (örneğin derinlik testi), GPU, okuma değeri ile yapılan işlemlerin bir anlam ifade etmesini sağlar.

Bununla birlikte, bir maliyet / fayda olayı da olabilir. GPU boru hattının bu yönünün programlanabilir hale getirilmesi, çip tasarımını biraz karmaşıklaştıracaktır ve hedef tampon okumaları için ihtiyaç / talep, diğer özelliklere kıyasla nispeten düşük olmuştur.


Sadece bunu genişletmek için, çerçeve arabellek erişiminin yavaş olmasının tarihsel nedeni, talimatların çok yoğun bir şekilde boru hattına bağlanmış olmasıdır. Belirli bir çerçeve arabellek pikseline erişim elde etmek, sorgulanan pikselle ilgili herhangi bir oluşturma işlemini tamamlamak için diğer tüm boru hatları temizlenene kadar mevcut boru hattının durdurulmasını içerir. Tamamen paralel olmayan bir GPU'nun tuhaf durumunda bile, her bir sorgu için tüm boru hattını temizleyeceksiniz, bu sadece kötü bir fikir. Şüphesiz şu anda programlanabilir donanım dünyasında işler biraz farklı ama benzer bir prensip geçerli.
Kylotan

4

Can sıkıcı olsa da, donanım üreticilerine oluşturma sürecini sayısız ve şeffaf bir şekilde optimize etme esnekliği sağlar.

Örneğin, PowerVR donanımı (kesinlikle geri dönmek için kullanılır, uzun bir süre kullanılmaz), oluşturulacak tüm sahne gönderilinceye kadar bekleyin, ardından ressam algoritmasını kullanarak otomatik derinlik sıralaması yapın ve aslında bir derinlik tamponu. Ekranı fayanslara böler ve her birini sırayla oluşturur.


4

Piksel gölgelendirici renk ve derinlik arabelleklerinden okuyamaz çünkü:

A ve B pikselleri donanımda tam olarak aynı anda gölgelenebilir, ancak B sonuçta ("sonra") A pikselinin üstünde görüntülenir.

Donanımın B'den önce A gölgesini garanti etmesini sağladıysanız, donanımın parçaları A gölgeli iken hiçbir şey yapmadan etrafında oturur ve ardından donanımın bazı parçaları B gölgeli iken hiçbir şey yapmadan etrafta oturur.

Hayal edilebilecek en kötü durumda, gölgelendirdiğiniz tüm pikseller üst üste oluşturulur ve binlerce GPU iş parçacığı - biri hariç - boşta durur. Bu bir iplik sabırla A, sonra B, sonra C piksel gölgeler ...

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.