Смешивание 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 ответ

Это решение, которое я использовал:

  1. включить цвет и альфа-запись
  2. glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA)
  3. визуализировать объекты переднего плана
  4. отрицать альфа пишет
  5. рендерить тени
  6. визуализировать объекты, отбрасывающие тени
  7. glBlendFunc(GL10.GL_ONE_MINUS_DST_ALPHA, GL10.GL_DST_ALPHA)
  8. визуализировать фоновые объекты

Это производит желаемый эффект теней, появляющихся только на переднем плане объектов. По сути, альфа-буфер становится трафаретным буфером с переменной непрозрачностью.

К счастью, у моих фоновых объектов нет прозрачности, как если бы они были, я не думаю, что был бы какой-либо способ достичь этого эффекта без использования шейдеров.

Другие вопросы по тегам