2010-09-23 17 views
7

Bunun mümkün olup olmadığından emin değilim, ama bu bir atıştı.OpenGL şablon arabelleği VEYA işletimi?

  1. ucuz bir shader kullanarak, LEQUAL ayarlı derinlik test ile yüzleri geri çekmek: Bu algoritma (kamera hacmi dışında olduğunda) kullanarak ertelenmiş Oluşturucu ışık hacimleri için overdrawını azaltmak için şablon tamponunu kullanıyorum onları şablon arabelleğinde işaretleyin.
  2. Pahalı aydınlatma gölgelendiricisini kullanarak, ön yüzeyleri GEQUAL olarak ayarlanmış derinlik testi ile çizin.

Bu, yalnızca ışık hacmindeki piksellerin gölgelenmesine neden olur. Birden fazla ışık çizerken, bununla ilgili sorun geliyor. İlk olarak, devlet değişiklikleri pahalı olduğundan, muhtemelen her ışık için ucuz ve pahalı gölgelendirici arasında sürekli geçiş yapmak en iyi fikir değildir. İdeal olarak, ucuz gölgelendirici ile 8 ışık hacmini, ardından da pahalı gölgelendirici ile 8 ışık hacmini oluşturarak şablon tamponunun 8 bitinden faydalanmak istiyorum. Ancak, hangi piksellerin hangi ışıklara ait olduğunu söylemenin bir yolu olmadığı için, ışıklar çakışma olduğunda ortaya çıkar.

Akla gelen çözüm, ışık başına şablon arabelleğinde 1 bit kullanılmasıdır. Bu nedenle, n numaralı ışık için şablon arabelleğinde n n bit işaretini ucuz geçişte işaretleyin, ardından yalnızca pahalı geçiş sırasında bu bit ile pikselleri işleyin.

Şablon arabelleğini daha önce kullanmadım, ancak okuduğumdan bu mümkün görünmüyor. Bunun çalışması için şablon arabelleğini bitwise OR kullanarak ayarlamanız ve şablon işlevinin bitsel AND olması gerekecekti. Ancak, ben gördüğüm şablon arabellek üzerindeki tek işlemler şunlardır: SIFIR, SIFIR, DEĞİŞTİR, INCR, DECR ve INVERT ve tek işlevleri şunlardır: ASLA, HER ZAMAN, DAHA, EŞİT, LEQUAL, JEQUAL, GREATER ve NOTQUAL.

Şablon tamponunu kullanarak bir şekilde bu VEYA ANDING davranışını elde etmenin bir yolu var mı? Ve değilse, ışık hacimlerini verimli bir şekilde işlemek için alternatif bir yaklaşım var mı?

cevap

6

ORing güncelleştirme davranışı almak için'u GL_REPLACE ile birlikte kullanın. ANDing sınama davranışını almak için GL_EQUAL ile birlikte glStencilFuncmask parametresini kullanın. Her iki durumda da ref parametresinin glStencilFunc'un 0xff olmasını isteyeceksiniz.

+0

AWESOME! Tam olarak aradığım şey bu. Çok teşekkür ederim! – Gumgo