OpenGL: Как сделать RGBA-> RGBA-блиттинг без изменения альфа-адреса - PullRequest
2 голосов
/ 28 сентября 2008

У меня есть текстура 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). Как мне этого добиться?

Ответы [ 2 ]

7 голосов
/ 28 сентября 2008

Вы можете установить режимы наложения для 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-функций.

Если вам не повезло, вы даже можете закончить программную эмуляцию рендеринга, вызвав странные функции: -)

1 голос
/ 28 сентября 2008

Может быть, вы могли бы использовать glColorMask ()? Это позволит вам включить / отключить запись в каждый из четырех компонентов цвета.

...