OpenGL - glBlendFunc

Я пытался найти конкретную математику, лежащую в основе внутренней работы glBlendFunc.

Чтобы уточнить, я знаю, что уравнение смешения:

srcChannels * srcFactor + dstChannels * dstFactor = channelsRendered.

мой вопрос: srcChannels, dstChannels и channelsRendered: 3-вектор (r, g, b) или 4-вектор (r, g, b, a)?

поскольку (0.2, 0.2, 0.2, 1.0) и (1.0, 1.0, 1.0, 0.2) должны выглядеть одинаково, здесь может быть место для двусмысленности.


person Matt Peck    schedule 31.03.2013    source источник


Ответы (1)


glBlendFunc работает на всех четырех каналах; glBlendFuncSeparate отделяет RGB от альфа.

На справочной странице по glBlendFunc описаны все различные режимы наложения. и операции, применяемые к различным каналам. glBlendFuncSeparate делает то же самое, включая операции с альфа-каналом. .

person radical7    schedule 31.03.2013
comment
Кроме того, что openGL интерпретирует полностью прозрачный пиксель как файл png? (0,0,0,0) или (1,1,1,0)? - person Matt Peck; 31.03.2013
comment
Я выяснил, что openGL интерпретирует полностью прозрачный пиксель как (1,1,1,0), почему это так? есть ли способ заставить его интерпретировать их как (0,0,0,0)? - person Matt Peck; 31.03.2013
comment
@MattPeck: что openGL интерпретирует полностью прозрачный пиксель из файла png? Ни то, ни другое; OpenGL не интерпретирует файл PNG. Вы передаете произвольные пиксельные данные OpenGL; OpenGL не знает и не заботится о том, что он был получен из файла PNG. Распаковщик PNG решает, как будет выглядеть прозрачный пиксель, а не OpenGL. - person Nicol Bolas; 01.04.2013
comment
@MattPeck Твой вопрос не совсем понятен. Прозрачный пиксель прозрачен благодаря нулевому альфа-компоненту. Итак, если этот пиксель является исходным цветом, а вы используете GL_SRC_ALPHA, цвет фрагмента не имеет значения. Однако я не думаю, что вы на самом деле имеете в виду. Если проблема в том, что файл PNG использует белый цвет, когда вы хотите черный, вы можете либо переназначить это в шейдере, либо использовать glPixelMap, если вы идете доисторически (и если да, используйте шейдер). Причина, по которой это работает, заключается в том, что шейдеры фрагментов выполняются до объединения фрагментов. - person radical7; 01.04.2013