OpenGL ES 2.0 ile ertelenmiş oluşturma / gölgeleme mümkün müdür?


20

StackOverflow bu sordum , ama burada daha anlamlı olabilir:

Herkes OpenGL ES 2.0 altında ertelenmiş oluşturma / gölgelendirme uyguladı mı? MRT'leri desteklemediğinden, yalnızca bir renk arabelleği ile "olağan" şekilde uygulanabilecek bir şey değildir.

Özellikle, iPad, iPhone4 (maaaybe iPhone 3gs) ve Android'de araştırıyorum. İPad / iPhone4 / iPhone3gs'deki GLESView uygulamasında GL_OES_RGB8_RGBA8 uzantısı var ve henüz çok derinlemesine bakmadım, ancak 8 bit / kanalla bu fikir ilginç: http://www.gamedev.net/topic/ 562138-opengl-es-20-ve-ertelenmiş-gölgelendirerek /

Başka fikir var mı? Performans açısından bile yapmaya değer mi?


Evet mümkün.
Quazi Irfan

7
Hangi teknik (ler) ile?
Jim Buck

Yanıtlar:


15

Evet mümkün. Ancak, özellikle faydalı değil.

İlk olarak, NV_draw_buffers uzantısına erişiminiz yoksa (adından da anlaşılacağı gibi, yalnızca NVIDIA'dır. Bu nedenle, Tegra üzerinde çalışmadığınız sürece, sahip değilseniz), ES 2.0 altındaki framebuffer nesneleri yalnızca bir görüntüye dönüşebilir zamanında. Bu nedenle, G tamponlarınızı oluşturmak için sahnenizi birden çok kez oluşturmanız ve böylece ertelenmiş oluşturmanın avantajlarından birini almanız gerekir.

İkincisi, mobil platformlardaki bant genişliği, orta sınıf GPU'larda bile alacağınızla aynı değildir. Ve bant genişliği, ertelenmiş oluşturmayı (birçok ışık için) değerli kılmak için çok önemlidir. Bu bant genişliği olmadan, ışık geçişleri gerçekten acı çekecek, performans açısından.

Üçüncüsü, PowerVR donanımı gerçekten bu tür şeyler için tasarlanmamıştır. Döşeme tabanlı işleme donanımıyla oluşturmayı optimize eder. Bu nedenle, ertelenmiş oluşturma, geleneksel bir tarama dönüştürme mimarisinden daha az yardımcı olacaktır.


6

Asıl sorun Fillrate. Mobil GPU'larda, doluluk oranınız düşüktür ve yerel çözünürlükte gerçek zamanlı olarak Ertelenmiş gölgeleme yapamazsınız.

İPhone 4 ve iPad 1'de, fillrate sadece saçma. İyi dolgu hızına sahip tek cihaz IOS iPad 2'dir, ancak yeterli olduğundan şüphe duyuyorum ... Android'de, sadece Tegra cihazlarında MRT kullanmak için GL_NV_draw_buffers var, ancak dolgu hızı da çok düşük. Mali 400 en iyi dolgu oranına sahip gibi görünüyor. Ağlamak istiyorsanız, bir renk dikdörtgeni tam ekran çözünürlüğünde 4 kez doldurmaya çalışın ... Birçok cihaz bunu 60 fps yapamaz.

Masaüstü GPU'larda, mobil gpus olarak 10 kez (veya daha fazla) dolgu hızınız vardır. Mobil GPU'ların CPU ile aynı belleği kullandığını ve özel belleğiniz olmadığını unutmayın.

WebGL'de (aynı API) bazı örnekler vardır, bu nedenle API'nın bir sınırlaması yoktur.


1
Zayıflığı doldurmak için +1. Gauss bulanıklığını 60 fps'de 1536x2048 çözünürlükte çalıştırmak için bile alamadım (sadece 4 örnekle bile kare hızını 30 fps'ye kadar
düşürdü

1
Bunun, uygulamanızın inceliklerine ve mobil donanım üzerinde en çok neyin etkilediğini anlamaya bağlı olduğunu düşünüyorum. Örneğin, bu adamlar 2012'de orta derecede performans gösteren bir DoF bulanıklığı yaptılar .
Mühendis

1

Gerçekten, ertelenmiş bir oluşturucu için ihtiyacınız olan mutlak minimumun ne olduğunu düşünmeniz gerekir. Ertelenmiş aydınlatmaya geri dönerseniz, GBuffer'da depolanması gereken veri miktarını azaltır ve gerçekten düşük ışık miktarını desteklemek için sahnenin yarısını 3 kez veya daha fazla hale getirmekten daha ucuz bir helluva lotudur.

Aşağıdaki GBuffer biçimi için gider:

  • Aydınlatma geçişi için derinlik arabelleğini yeniden kullanın, bunun mobil cihazlarda ne kadar geniş bir şekilde desteklendiğinden emin değilsiniz, ancak serbest derinlik dokusu.
  • İçinde saklayacağım tek bir GBuffer dokusu: Normal U, Normal V, Param 0, Param 1. Lambert-Azimuthal kodlaması normaller için gerçekten güzel görünüyor ve bunları sadece kodlamak ve kod çözmek için nispeten ucuz olan iki bileşene sıkıştırıyor.
  • Aydınlatma değişkenleri için iki parametre çoktur, eğer donanım dinamik dallanma ile iyi sonuç verirse, birden fazla aydınlatma fonksiyonu için bir numaralandırma olarak kullanabilirsiniz.

Ertelenmiş aydınlatma, sahneyi iki kez oluşturmanız dışında, ertelenmiş oluşturmaya benzer:

  1. Geometri Derinliği, Normaller ve Işık Parametrelerini GBuffer'a Oluşturun.
  2. Işıkları biriktirme arabelleğine dönüştür.
  3. Geometriyi malzeme gölgeleyicileriyle işleyin, aydınlatmanızı burada da birleştirin. Aydınlatma denklemlerinin ters operatörlerini çalışma ile iyi iseniz, bu adımla çok güzel şeyler yapabilirsiniz.
  4. Karşılayabileceğiniz herhangi bir son işlem yapın, verimlilik uğruna burada derinliği ve normal dokuları kötüye kullandığınızdan emin olun.

Aydınlatma sonuçlarının saklanması hakkında. Biriktirme tamponunun sadece standart bir 32 bit renk dokusu olması için dağınık renk ve aynasal parlaklık depolamaya düşkün oldum. Yaygın rengin kromasını hesaplayarak ve bunu aynasal parlaklıkla birleştirerek aynasal rengi tahmin edebilirsiniz.

Bununla birlikte en önemli kısım, derinlik şablon tamponunu sonuna kadar kullanmasıdır, aydınlatma kodlarından herhangi birini ihtiyaç duymadığınız yerlerde oluşturmamanızı sağlar. Parça gölgelendiricilerine, cihazın görüntülenebilir aralığının (1e-3 genellikle güvenli bir kesim) altında ışık görünürlüğü bırakacak terimlerle ilgili bazı atma ifadeleri ekleyecek kadar ileri giderdim.


discardbirçok / en çok GPU'nun kullandığı kiremit tabanlı boru hatları için gerçekten çok kötü.
Mühendis

1

Ertelenmiş aydınlatmayı düşünün. Özetle, ertelenmiş aydınlatma, bir ekran alanı ışık haritasını hesaplamak için ertelenmiş gölgelendirmenin indirgenmiş bir versiyonunu kullanan bir tekniktir. İkinci geçişte geometri, ekran bilgisi ışık haritası kullanılarak aydınlatma bilgisi olarak yeniden oluşturulur.

Bu teknik, daha az öznitelik gerektiğinden G-Tamponunun boyutunu azaltmak için kullanılır. Ayrıca G-Buffer ve ekran alanı ışık haritasının ekrandan daha düşük çözünürlükte olması avantajını da satın alır.

Sıkı bir GLES 2.0 tabanlı oluşturucu (deneysel olmasına rağmen) uyguladım ve G-Buffer'ı bir RGBA dokusuna kadar kaynatmayı başardım (evet, bir renderbuffer yerine texture2D kullandım). Ekran alanı normal haritasını + alfa kanalındaki derinlik tamponunu (hatırladığım kadarıyla bir logaritma kullanılarak sıkıştırılmış) içeriyordu.

(Denilen pozisyon nitelikleri Dünya burada) bir perspectivic projeksiyonda, yani gerçeği kullanarak aydınlatma geçişi sırasında hesaplanabilir .xy değerine bölünmesi .Z böylece,:

xyfrustum=xywÖrld/zwÖrld

Ben pozisyon özniteliğinin xy yaparak yaklaşık :

xywÖrld=xyfrustum*zwÖrld

Not: Projeksiyon matrisinin ayarlarına bağlı olarak daha fazla ayar yapmak zorunda kaldım.

Ayrıca değer belirterek ı atlamak için yetenekli olduğu yani, .z ı yeniden inşa edebileceğine beri normal vektörlerin bileşenini .z gelen .xy normal vektör böylece normalize edildiğinden:

x2+y2+z2=1x2+y2+z2=1z2=1-(x2+y2)z=1-(x2+y2)

Bu tekniği kullanarak, RGBA G-Buffer'ımdaki başka bir kanalı serbest bırakabildim ve ekran alanı spekülatif haritasını (veya isterseniz parlaklığı) saklamak için bunu kullandım.


BTW: Oluşturucum hiçbir oyun motoruna bağlı değil. Selam bir merhaba dünya demo, Suzanne render.
Simon Schmidt

0

Evet, kesinlikle mümkün. Doldurma oranı böyle bir sorun değil çünkü mobil grafik yongaları çok yüksek çözünürlüklü ekranlarla başa çıkmak için tasarlanmıştır. Aslında, ertelenmiş oluşturma buna yardımcı olur, çünkü aydınlatma hesaplamanız sahne karmaşıklığından bağımsızdır, bu nedenle aşırı çekim yavaşlamaya neden olmaz. İşte dördüncü nesil bir iPad'deki uygulamam: http://www.youtube.com/watch?v=K4X1oF6b4V8

Performansın dört katı olmasını istiyorsanız, işlediğiniz dokunun çözünürlüğünün sadece yarısı. Bir retina ekranında 3D grafikler ile gerçekten farklı göremiyorum zaten.

Mobil grafik yongaları, dokudan dokuya işlem biçimleri nedeniyle ertelenmiş render işleminde son derece iyidir. Pencere bağlamı yerine bir doku oluşturmaya başladığınızda genellikle büyük bir performans isabetine neden olan PC grafik kartlarının aksine, mobil grafikler bunu performans isabeti olmadan yapmak için tasarlanmıştır. Böylece, bir masaüstü grafik kartında karşılaştığınız ilk performans cezası olmadan ertelenmiş bir oluşturucunun ölçeklenebilirliğini elde edersiniz.

Uygulamam sırasında, OpenGLES'in birden fazla hedefe dönüştürülmesi eksikti, bu yüzden ekran geçişini ve ayrı geçişlerde normal çizmem gerekiyordu. Bu, OpenGLES'in daha yeni sürümlerinde düzeltilebilir, ancak çözümlerin henüz tüketici mobil donanımında mevcut olup olmadığını bilmiyorum.


3
"Mobil grafik yongaları, render-doku işlemesi nedeniyle ertelenmiş render işleminde son derece iyidir. Genellikle bir pencere bağlamı yerine bir dokuya dönüştürmeye başladığınızda büyük bir performans artışı yaratan PC grafik kartlarının aksine, mobil grafikler performans artışı olmadan bunu yapmak için tasarlanmıştır. " Bu orada büyük bir iddia. Bu iddiayı destekleyecek saygın referanslarınız var mı?
Panda Pijama
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.