OpenGL:Как выполнить копирование RGBA->RGBA без изменения альфа-канала назначения
-
02-07-2019 - |
Вопрос
У меня есть текстура OpenGL RGBA, и я накладываю на нее еще одну текстуру RGBA, используя объект кадрового буфера.Проблема в том, что если я использую обычные функции смешивания сglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),
результирующий блит приводит к изменению альфа целевой текстуры, делая ее слегка прозрачной в тех местах, где альфа ранее была равна 1.Я бы хотел, чтобы альфа целевой поверхности никогда не менялась, но в противном случае эффект на значения RGB должен быть точно таким же, как при GL_SRC_ALPHA
и GL_ONE_MINUS_SRC_ALPHA
.Таким образом, функции коэффициента смешивания должны быть (As,As,As,0) и (1-As,1-As,1-As,1).Как я могу этого добиться?
Решение
Вы можете установить режимы наложения для RGB и альфа для разных уравнений:
void glBlendFuncSeparate(
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
В вашем случае вы хотите использовать следующие перечисления:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
Обратите внимание, что вам, возможно, придется импортировать функцию glBlendFuncSeparate как расширение.Хотя это безопасно.Функция существует уже очень давно.Это часть OpenGL 1.4.
Другой способ сделать то же самое — отключить запись в альфа-канал с помощью glColorMask:
void glColorMask( GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha )
Это мог быть намного медленнее, чем glBlendFuncSeparate, поскольку драйверы OpenGL оптимизируют наиболее часто используемые функции, а glColorMask — одна из редко используемых функций OpenGL.
Если вам не повезет, вы можете даже получить эмуляцию программного рендеринга, вызывая странные функции :-)
Другие советы
Может быть, вы могли бы использовать glColorMask()?Он позволяет включать/отключать запись в каждый из четырех цветовых компонентов.