Bagaimana saya bisa memberi tahu shader fragmen untuk tidak menulis piksel tertentu?

11

Dalam WebGL saya ingin mengirim ruang layar quad melalui yang diproses oleh shader fragmen, tetapi memiliki shader fragmen hanya menuliskan piksel dalam kondisi tertentu (katakanlah ... bahwa itu dalam lingkaran, atau bahwa pixel milik sisi positif ruang setengah didefinisikan oleh persamaan kurva atau sesuatu).

Apakah mungkin dalam shader fragmen untuk mengatakan "jangan tulis piksel"?

Saya tahu ini bisa dicapai dengan menggunakan berbagai metode lain seperti alpha blending, rendering ini terlebih dahulu dan meletakkannya di latar belakang di mana ia tidak ingin menggambar pixel, atau mungkin melakukan beberapa trik dengan buffer stensil atau kedalaman. Saya juga tahu saya bisa membuat banyak geometri untuk mencocokkan apa yang ingin saya render.

Apakah ada cara untuk membuat shader fragmen memilih untuk tidak menulis piksel sama sekali?

Alan Wolfe
sumber

Jawaban:

10

Ya, Anda dapat discardmenggunakan shader fragmen untuk menghindari penulisan piksel. Ini adalah contoh acak yang saya gali dari Google.

Perhatikan bahwa ini mungkin tidak benar-benar menghentikan shader fragmen dari pemrosesan (karena GPU cenderung memproses fragmen dalam blok; hanya membuang dari semua fragmen dalam blok yang akan meninggalkan pemrosesan). Tetapi fragmen tidak akan ditulis ke output, yang pada dasarnya adalah apa yang Anda inginkan.

Anda mungkin tertarik pada pertanyaandiscard terkait ini tentang kinerja dan yang satu ini di SO.

Saya tidak tahu apakah ini didukung di WebGL. Jika tidak, Anda harus kembali ke salah satu saran Anda (seperti alpha blending; Saya pikir itu akan menjadi yang paling mudah).

Komunitas
sumber
3

The discardpernyataan berguna.

Anda tidak terlalu banyak bicara tentang jalur keputusan Anda, jadi saya akan menawarkan contoh menggunakan pencarian tekstur sederhana:

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

(Itu dari beberapa kode contoh yang saya tulis sebelum saya belajar tentang alpha blending.)

berantakan
sumber