Як я можу сказати шейдер фрагмента не писати певний піксель?


11

У WebGL я хотів би надіслати простір екрану через цей фрагмент, який обробляється фрагментом шейдера, але шейдер фрагмента повинен виписати лише піксель при певних умовах (скажімо, що це було в колі, або що піксель належав до позитивної сторони напівпростору, визначеної рівнянням кривої чи іншим).

Чи можна в фрагменті шейдера сказати "не пишіть піксель"?

Я знаю, що це може бути досягнуто за допомогою різних інших методів, таких як альфа-змішування, рендерінг цього спочатку і введення фонового кольору туди, де він не хоче малювати піксель, або, можливо, робити якийсь трюк з буферами глибини або трафарету. Я також знаю, що можу створити купу геометрії, щоб відповідати тому, що я хочу зробити.

Чи є спосіб, якби змусити фрагмент шейдера вибрати взагалі не писати піксель?

Відповіді:


10

Так, ви можете discardу фрагменті шейдера, щоб уникнути запису пікселя. Ось випадковий приклад, який я викопав з Google.

Зауважте, що це насправді може не зупинити шейдер фрагмента від обробки (оскільки GPU прагне обробляти фрагменти блоками; лише відкидання від усіх фрагментів блоку відмовиться від обробки). Але фрагмент не буде записаний на висновок, що в основному є тим, що ви хочете.

Можливо, вас зацікавить це пов’язане питання щодо продуктивностіdiscard та цього питання щодо програми SO.

Я навіть не маю уявлення, чи підтримується це в WebGL. Якщо це не так, вам потрібно буде повернутися до однієї з ваших пропозицій (наприклад, альфа-змішування; я думаю, це було б найпростішим).


3

discardЗаява пригождается.

Ви не надто багато сказали про свій шлях рішення, тому я запропоную приклад, використовуючи простий пошук текстури:

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

(Це з деякого зразкового коду, який я писав, перш ніж дізнався про альфа-змішування.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.