Смешивание OpenGL с исходной и целевой альфа
Я пытаюсь визуализировать текстуру с альфа-фреймом в буфер с альфа-каналом. Мне нужно, чтобы прозрачность текстуры контролировалась комбинацией ее собственной альфы, и альфа уже визуализировалась в буфер кадра.
то есть:
Нормальная прозрачность:
(src_colour * src_alpha) + (dst_colour * 1-src_alpha)
Требуемая прозрачность:
(src_colour * src_alpha * dst_alphe) + (dst_colour * 1- (src_alpha * dst_alpha))
Кто-нибудь может понять, как это сделать?
Я работаю над этим уже 9 часов:-)
Я использую OpenGL 1.0 с GL11ExtensionPack на Android, поэтому у меня есть доступ к glBlendFunc и glBlendFuncSeparate. Я бы предпочел не идти по пути GLES20 с шейдерами, так как для этого потребовалось бы переписать много кода.
Спасибо Андрей
1 ответ
Это решение, которое я использовал:
- включить цвет и альфа-запись
- glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA)
- визуализировать объекты переднего плана
- отрицать альфа пишет
- рендерить тени
- визуализировать объекты, отбрасывающие тени
- glBlendFunc(GL10.GL_ONE_MINUS_DST_ALPHA, GL10.GL_DST_ALPHA)
- визуализировать фоновые объекты
Это производит желаемый эффект теней, появляющихся только на переднем плане объектов. По сути, альфа-буфер становится трафаретным буфером с переменной непрозрачностью.
К счастью, у моих фоновых объектов нет прозрачности, как если бы они были, я не думаю, что был бы какой-либо способ достичь этого эффекта без использования шейдеров.