Смешивание 3 слоев в OpenGL с фоном

Какими будут параметры glBlendfunc() для достижения следующего эффекта:

0) фон, непрозрачный.

1) first_layer, всего один цвет.

2) полупрозрачная сфера, которая сливается с first_layer, но не с фоном...

ИЗМЕНИТЬ

Ниже приведены рендеры, которые, я надеюсь, показывают, чего я пытаюсь достичь.

Это оригинал - сфера на фоне

Это желаемый эффект - зеленый цвет между сферой и фоном и сферой смешивается с цветом, но не с фоном


person Stpn    schedule 14.07.2012    source источник
comment
полупрозрачная сфера, которая сливается с first_layer, но не с фоном... Что это значит? Можешь показать мокап?   -  person Tim    schedule 14.07.2012
comment
да, сделаю и выложу через пару часов. Спасибо!   -  person Stpn    schedule 14.07.2012
comment
Добавил визуализацию в вопрос   -  person Stpn    schedule 14.07.2012
comment
Я не совсем уверен, что понимаю, почему вы хотите возиться с прозрачностью. Разве вы не можете просто изменить цвет сферы, когда рисуете ее? В противном случае просто нарисуйте круг цвета без смешивания, а затем нарисуйте сферу с помощью (src, 1-src), как описано ниже. Хотя я чувствую, что что-то упускаю.   -  person Tim    schedule 14.07.2012
comment
Я просто попытался упростить для примера, случай немного сложнее - в реальной ситуации вместо сферы у меня есть рендеринг меха (много треугольников) использование смешивания помогает найти компромисс между производительностью и внешним видом. (использование шейдеров и освещения снижает производительность). Я действительно могу нарисовать объект (мех) дважды, но это снова снижает производительность, поэтому мне было интересно, возможно ли вообще просто поместить цвет между фоном и объектом и смешать цвет только с объектом. Надеюсь, это немного устранит путаницу, а не усугубит ее.   -  person Stpn    schedule 14.07.2012
comment
Теперь это имеет больше смысла, но я все еще не могу сказать, что полностью понимаю. Объект, который вы рисуете, и «first_layer» покрывают одну и ту же площадь в пикселях? Или вы надеялись просто покрыть экран «невидимым» first_layer, а затем просто увидеть цвет в области, где нарисован мех, в противном случае видя фон? Если это так, то я не знаю, даст ли простое смешивание желаемый результат.   -  person Tim    schedule 14.07.2012
comment
Да, именно это › в надежде просто покрыть экран «невидимым» first_layer, а потом просто увидеть цвет в области, где нарисован мех, а в противном случае увидеть фон.. Что ж, спасибо. Думаю, мне придется придумать другой способ) Приятно знать, что мне не следует тратить больше времени на смешивание ... если вы можете опубликовать это как ответ, я приму это ...   -  person Stpn    schedule 14.07.2012


Ответы (1)


Судя по краткому описанию, можно смешать слой 2 (сфера) со слоем 1 (first_layer), а затем наложить его на слой 0 (фон). Первое смешение должно быть возможным с использованием обычных параметров альфа-смешивания:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Однако glBlendFunc довольно устарел. В наши дни OpenGL поддерживает шейдеры как на настольных компьютерах, так и на мобильных устройствах, что значительно упрощает достижение желаемого.

person gavinb    schedule 14.07.2012
comment
BlendFunc не устарел, он по-прежнему является важной частью конвейера. Шейдеры еще не имеют возможности сэмплировать целевой буфер кадра на момент написания статьи. - person Tim; 14.07.2012
comment
@Tim Действительно, правда - я думал о чем-то другом из замененной части API. - person gavinb; 14.07.2012