Как я могу сказать фрагментному шейдеру не писать определенный пиксель?

11

В WebGL я хотел бы отправить квадратор пространства экрана, который обрабатывается фрагментным шейдером, но чтобы фрагментный шейдер выписывал пиксель только при определенных условиях (скажем ... что он был внутри круга, или что пиксель принадлежал положительной стороне полупространства, определенного уравнением кривой или чем-то еще).

Возможно ли в фрагментном шейдере сказать «не пиши пиксель»?

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

Есть ли способ заставить фрагментный шейдер вообще не писать пиксель?

Алан Вульф
источник

Ответы:

10

Да, вы можете discardв фрагментном шейдере избежать записи пикселя. Вот случайный пример, который я выкопал из Google.

Обратите внимание, что это может не помешать обработке фрагментного шейдера (поскольку графический процессор имеет тенденцию обрабатывать фрагменты в блоках; только отбрасывание из всех фрагментов в блоке прекратит обработку). Но фрагмент не будет записан в вывод, что в принципе и нужно.

Вы можете быть заинтересованы в этом связанном с вопросом о выполненииdiscard и этом на SO.

Я понятия не имею, если это поддерживается в WebGL, хотя. Если это не так, вам нужно обратиться к одному из ваших предложений (например, к альфа-смешиванию; я думаю, это будет самым простым).

Сообщество
источник
3

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

Вы не слишком много говорили о своем пути принятия решения, поэтому я приведу пример с использованием простого поиска текстуры:

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

(Это из некоторого примера кода, который я написал до того, как узнал об альфа-смешивании.)

Раттер
источник