Условное смешивание с OpenGL ES
Я хочу реализовать операцию фрагментации / смешивания с использованием OpenGL ES 3.1, которая удовлетворяет следующим требованиям:
- Если пиксель, созданный фрагментным шейдером, удовлетворяет определенному условию (которое может быть определено уже в вершинном шейдере), то его значение цвета должно быть добавлено к значению в кадровом буфере.
- Если пиксель не удовлетворяет условию, то цвет должен полностью заменить тот, что находится в кадровом буфере.
Можно ли это сделать с помощью обычных функций смешивания, альфа-трюков и т. Д.?
2 ответа
Я думаю, что вы могли бы просто использовать стандартное предварительно умноженное альфа-смешение:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Если вы хотите заменить, вы выводите альфа-значение 1 из вашего фрагментного шейдера. Если вы хотите сделать добавление, вы выводите альфа-значение 0 из вашего фрагментного шейдера.
Это предполагает, что вас действительно интересуют только значения RGB, которые попадают в ваш кадровый буфер.
Если вы знаете это во время затенения вершин, я предполагаю, что целые треугольники являются либо одной смесью, либо другой. Это идеальная вещь для тестирования трафарета, если у вас не слишком много геометрии.
- Очистить трафарет до нуля.
- Нарисуйте фигуру с отключенной записью цветом, а для трафарета задайте один для областей, которые соответствуют одному из двух правил наложения.
- Установите правило смешивания один.
- Нарисуйте фигуру с включенным тестированием трафарета и проходите, когда трафарет == 0.
- Установите правило смешивания два.
- Нарисуйте фигуру с включенным тестированием трафарета и проходите, когда трафарет == 1.
Сколько это стоит, зависит от вашей геометрии, так как вам нужно передать ее на рендеринг несколько раз, но часть тестирования трафарета обычно близка к "бесплатной".