Bir parça gölgelendiriciye belirli bir piksel yazmamasını nasıl söyleyebilirim?


11

Bir WebGL'de, bir parça gölgelendirici tarafından işlenen bir ekran alanı dörtlüsü göndermek istiyorum, ancak parça gölgelendiricinin yalnızca belirli koşullar altında bir piksel yazmasını sağlayın (örneğin ... bir daire içinde olduğunu veya piksel, bir eğri denklemi veya başka bir şeyle tanımlanan bir yarımuzayın pozitif tarafına aitti).

Bir fragman gölgelendiricisinde "piksel yazma" demek mümkün müdür?

Bunun, alfa harmanlama, bunu ilk oluşturma ve arka plan rengini bir piksel çizmek istemediği yere koyması veya belki de derinlik veya şablon tamponlarıyla bir numara yapması gibi çeşitli yöntemler kullanılarak gerçekleştirilebileceğini biliyorum. Ayrıca oluşturmak istediğim şeye uyması için bir grup geometri oluşturabileceğimi de biliyorum.

Parça gölgelendiricinin bir piksel yazmamayı seçmesinin bir yolu var mı?

Yanıtlar:


10

Evet, discardpikseli yazmaktan kaçınmak için fragman gölgesinde yapabilirsiniz . İşte Google'dan kazdığım rastgele bir örnek .

Bunun aslında parça gölgelendiricisinin işlenmesini durduramayabileceğini unutmayın (GPU parçaları bloklar halinde işleme eğilimi gösterir; yalnızca bir bloktaki tüm parçalardan atıldığında işleme son verilir). Ancak parça çıktıya yazılmayacak, temelde istediğiniz şey bu.

Bu, ilgili ilginizi çekebilir performansı hakkında sorudiscard ve bu bir benzeri.

Bu WebGL'de destekleniyorsa hiçbir fikrim yok. Değilse, önerilerinizden birine geri dönmeniz gerekir (alfa harmanlama gibi; bence en basit olanı bu olacaktır).


3

discardİfadesi işe yarar.

Karar yolunuz hakkında çok fazla şey söylemediniz, bu yüzden basit bir doku araması kullanarak bir örnek sunacağım:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(Bu, alfa harmanlamayı öğrenmeden önce yazdığım bazı örnek kodlardan.)

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.