Могу ли я использовать OpenGL-ES glBlendFunc, чтобы влиять на смешивание, чтобы принимать во внимание цель? - PullRequest
1 голос
/ 10 марта 2012

заголовок должен показаться несколько загадочным, но я не мог объяснить, что именно хочу сделать, поэтому нарисовал картинку, чтобы визуализировать мою проблему:

enter image description here

Черные части прозрачны (он же альфа = 0). У меня есть синий объект (слева) в кадровом буфере, и я хочу отобразить на нем белое растровое изображение (в середине), чтобы оно выглядело как объединенное растровое изображение (справа).

Проблема в том, что, если я использую стандарт glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);, отображается вся часть белого объекта. Я не хочу, чтобы он полностью перекрывал материал в кадровом буфере (синий), но должен быть видимым только в тех частях, где его значение альфа> 0 (видно). И тогда он также должен учитывать свои собственные альфа-значения (обратите внимание на дыру в белом объекте).

Возможно ли что-то подобное с glBlendFunc или мне для этого нужно написать шейдер?

PS: я посмотрел документацию по glBlendFunc по адресу http://www.khronos.org/opengles/documentation/opengles1_0/html/glBlendFunc.html, но на самом деле я ничего не понял с этим.

PPS: я использую OpenGL-ES 2.0 на Android с C ++, но я не думаю, что язык / платформа так важны.

1 Ответ

1 голос
/ 10 марта 2012

Не думаю, что это можно будет сделать просто с помощью функции наложения. Вы хотите, чтобы исходный пиксель умножался как на исходную, так и на целевую альфа, тогда как blendfunc допускает только одно или другое.

Однако желаемый результат может быть возможен при некотором использовании буфера трафарета. Я не эксперт в этом, но я думаю, что вы можете установить опцию трафарета для увеличения при рисовании фонового изображения, а затем, когда вы рисуете растровое изображение, установите тест трафарета, чтобы отклонить, где stencil == 0 (с смешиванием все еще включено, чтобы получить прозрачная область растрового изображения правильная). Вам придется пересмотреть API для glStencilOp и glStencilFunc, чтобы определить точные правильные аргументы для использования.

Это также возможно при некоторой комбинации glBlendFunc и glAlphaFunc, но это будет зависеть от порядка, в котором они оцениваются, поэтому я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...