OpenGL:Как выполнить копирование RGBA->RGBA без изменения альфа-канала назначения

StackOverflow https://stackoverflow.com/questions/146140

  •  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()?Он позволяет включать/отключать запись в каждый из четырех цветовых компонентов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top