Функция glBlendFunc

Функция glBlendFunc задает пиксельную арифметику.

Синтаксис

void WINAPI glBlendFunc(
   GLenum sfactor,
   GLenum dfactor
);

Параметры

sfactor

Указывает, как вычисляются красные, зеленые, синие и альфа-факторы смешивания источника. Принимаются девять символических констант: GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA и GL_SRC_ALPHA_SATURATE.

dfactor

Указывает, как вычисляются красные, зеленые, синие и альфа-коэффициенты смешения назначения. Принимаются восемь символических констант: GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA и GL_ONE_MINUS_DST_ALPHA.

Возвращаемое значение

Эта функция не возвращает значение.

Коды ошибок

Следующие коды ошибок могут быть получены функцией glGetError .

Имя Значение
GL_INVALID_ENUM
Значение sfactor или dfactor не является допустимым.
GL_INVALID_OPERATION
Функция была вызвана между вызовом glBegin и соответствующим вызовом glEnd.

Комментарии

В режиме RGB пиксели можно отрисовать с помощью функции, которая смешивает входящие (исходные) значения RGBA со значениями RGBA, которые уже находятся в framebuffer (целевые значения). По умолчанию наложение отключено. Используйте glEnable и glDisable с аргументом GL_BLEND, чтобы включить и отключить смешение.

Если этот параметр включен, glBlendFunc определяет операцию смешивания. Параметр sfactor указывает, какой из девяти методов используется для масштабирования компонентов исходного цвета. Параметр dfactor указывает, какой из восьми методов используется для масштабирования компонентов цвета назначения. Одиннадцать возможных методов описаны в следующей таблице. Каждый метод определяет четыре коэффициента масштабирования по одному для красного, зеленого, синего и альфа-канала.

В таблице и в последующих уравнениях компоненты цвета источника и назначения называются (R? , G? , B? , A? ) и (Rd , Gd , Bd , Ad ). Они понимаются как целочисленные значения от нуля до (kR , kG , kR , kA ), где

kR = 2мR - 1

kG = 2mG - 1

kB = 2мB - 1

kA = 2мA - 1

и (mR , mG , mB , mA ) — количество красных, зеленых, синих и альфа-битовых плоскостей.

Коэффициенты масштабирования источника и назначения называются (sR , sG , sB , sA ) и (dR , dG , dB , dA ). Коэффициенты масштабирования, описанные в таблице , обозначаемые (fR , fG , fB , fA ), представляют исходные или целевые факторы. Все коэффициенты масштабирования имеют диапазон [0,1].

Параметр (fR , fG , fB , fA )
GL_ZERO (0,0,0,0)
GL_ONE (1,1,1,1)
GL_SRC_COLOR (R? / kR , G? / kG , B? / kB , A? / kA )
GL_ONE_MINUS_SRC_COLOR (1,1,1,1) - (R? / kR , G? / kG , B? / kB , A? / kA )
GL_DST_COLOR (Rd) / kR , Gd / kG , Bd / kB , Ad / kA )
GL_ONE_MINUS_DST_COLOR (1,1,1,1) - (Rd / kR , Gd / kG , Bd / kB , Ad / kA )
GL_SRC_ALPHA (A? / kA , A? / kA , A? / kA , A? / kA )
GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) - (A? / kA , A? / kA , A? / kA , A? / kA )
GL_DST_ALPHA (Ad) / kA , Ad / kA , Ad / kA , Ad / kA )
GL_ONE_MINUS_DST_ALPHA (1,1,1,1) - (Ad / kA , Ad / kA , Ad / kA , Ad / kA )
GL_SRC_ALPHA_SATURATE (i,i,i, 1)

В этой таблице:

i = min (A? , kA - D ) / kA

Чтобы определить смешанные значения RGBA пикселя при рисовании в режиме RGBA, система использует следующие уравнения:

R (d) = min( kR , R? sR + RdR dR )

G (d) = min( kG , G? sG + Gdg g )

B (d) = min( kB, B? sB + BdB dB )

A (d) = min( kA , A? sA + DDA )

Несмотря на кажущуюся точность приведенных выше уравнений, арифметическое смешение точно не указано, так как смешивание работает с неточными целочисленными значениями цвета. Однако коэффициент смешения, который должен быть равен единице, гарантированно не изменит его мультипликатор, а коэффициент смешения, равный нулю, уменьшает его коэффициент умножения до нуля. Например, если sfactor имеет значение GL_SRC_ALPHA, dfactor — GL_ONE_MINUS_SRC_ALPHA, а A? равен kA, уравнения сокращают до простой замены:

Rd = R?

Gd = G?

Bd = B?

Ad = A?

Примеры

Прозрачность лучше всего реализовать с помощью glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) с примитивами, отсортированных от самых дальних к ближайшим. Обратите внимание, что для вычисления прозрачности не требуется наличие альфа-битовых плоскостей в framebuffer.

Вы также можете использовать glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) для отрисовки сглаживаемых точек и линий в произвольном порядке.

Чтобы оптимизировать сглаживание многоугольников, используйте glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE) с многоугольниками, отсортированных от ближайшего к самому дальнему. (Сведения о сглаживании многоугольников см. в аргументе GL_POLYGON_SMOOTH в glEnable .) Целевые альфа-битовые плоскости, которые должны присутствовать для правильной работы этой функции смешения, сохраняют накопленный объем покрытия.

Входящий альфа-канал (источник) — это непрозрачность материала в диапазоне от 1,0 (KA ), представляющего полную непрозрачность, до 0,0 (0), представляющую полную прозрачность.

При включении нескольких буферов цвета для рисования каждый включенный буфер смешивается отдельно, а содержимое буфера используется для цвета назначения. (См . glDrawBuffer.)

Наложение влияет только на отрисовку RGBA. Он игнорируется отрисовщиками цветовых индексов.

Следующие функции извлекают сведения, связанные с glBlendFunc:

glGet с аргументом GL_BLEND_SRC

glGet с аргументом GL_BLEND_DST

glIsEnabled с аргументом GL_BLEND

Требования

Требование Значение
Минимальная версия клиента
Windows 2000 Professional [только классические приложения]
Минимальная версия сервера
Windows 2000 Server [только классические приложения]
Заголовок
Gl.h
Библиотека
Opengl32.lib
DLL
Opengl32.dll

См. также раздел

glAlphaFunc

glBegin

glClear

glDisable

glDrawBuffer

glEnable

glGet

glIsEnabled

glLogicOp

glStencilFunc