Условное смешивание с OpenGL ES - PullRequest
0 голосов
/ 21 декабря 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

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

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

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

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

0 голосов
/ 21 декабря 2018

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

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

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

...