2012-03-10 1 views
1

название должно показаться несколько загадочным, но я не мог толком объяснить, есть то, что я хочу сделать, так что я нарисовал картину, чтобы визуализировать мою проблему:Могу ли я использовать glBlendFunc для OpenGL-ES, чтобы повлиять на смешение, чтобы учесть цель?

enter image description here

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

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

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

PS: Я просмотрел документацию glBlendFunc по адресу http://www.khronos.org/opengles/documentation/opengles1_0/html/glBlendFunc.html, но я действительно никуда не схожу.

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

ответ

1

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

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

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

+0

Привет, спасибо за ваш ответ, и я думаю, что вы правы. Я попробовал это с glBlendFunc и glAlphaFunc, но, подумав об этом, я не думаю, что это возможно. Я не могу использовать Stencil, чтобы делать то, что я хочу, потому что это было бы излишним, но я просто написал новый шейдер и создал второй фреймбуфер, и теперь он работает. Спасибо за ваш совет. – HardCoder

Смежные вопросы