Условное смешивание с OpenGL ES

Я хочу реализовать операцию фрагментации / смешивания с использованием OpenGL ES 3.1, которая удовлетворяет следующим требованиям:

  • Если пиксель, созданный фрагментным шейдером, удовлетворяет определенному условию (которое может быть определено уже в вершинном шейдере), то его значение цвета должно быть добавлено к значению в кадровом буфере.
  • Если пиксель не удовлетворяет условию, то цвет должен полностью заменить цвет в кадровом буфере.

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

2

Решение

Я думаю, что вы могли бы просто использовать стандартное предварительно умноженное альфа-смешение:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

Если вы хотите заменить, вы выводите альфа-значение 1 из вашего фрагментного шейдера. Если вы хотите сделать добавление, вы выводите альфа-значение 0 из вашего фрагментного шейдера.

Это предполагает, что вас действительно интересуют только значения RGB, которые попадают в ваш кадровый буфер.

2

Другие решения

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

  • Очистить трафарет до нуля.
  • Нарисуйте фигуру с отключенной записью цветом, а для трафарета задайте один для областей, которые соответствуют одному из двух правил наложения.
  • Установите правило смешивания один.
  • Нарисуйте фигуру с включенным тестированием трафарета и проходите, когда трафарет == 0.
  • Установите правило смешивания два.
  • Нарисуйте фигуру с включенным тестированием трафарета и проходите, когда трафарет == 1.

Сколько это стоит, зависит от вашей геометрии, так как вам нужно передать ее на рендеринг несколько раз, но часть тестирования трафарета обычно близка к «бесплатной».

2

По вопросам рекламы [email protected]