glBlendFunc - встановлює арифметику пікселя.

C-специфікація

void glBlendFunc (GLenum sfactor,
                  GLenum dfactor) ;

Параметри

sfactor вкзаує, як обчислюються множники червоного, зеленого, синього і компонент прозорості джерельного кольору. Приймаються наступні символічні константи: GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, 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_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA і GL_SRC_ALPHA_SATURATE. Значення за умовчанням являється GL_ONE.

dfactor вказує як обчислюються множники компонентів кінцевого кольору для червоного, зеленого і синього компонентів і компоненту прозорості. Приймаються наступні символічні константи: GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, 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_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA і GL_ONE_MINUS_CONSTANT_ALPHA. Значення за умовчанням являється GL_ZERO.

Опис

У режимі RGBA, пікселі можна малювати використовуючи функцію, яка змішує вхідні (джерельні) RGBA значення з значеннями RGBA, які присутні у буфері кадру (кінцеві значення). Дане змішування по замовчуванню вимкнене. Використовуйте glEnable і glDisable з аргументом GL_BLEND для увімкнення або вимкнення змішування.

Функція glBlendFunc визначає оперції для змішування, якщо вона увімкнена. Параметр sfactor вказує який метод необхідно використовувати для масштабування джерельних кольорових компонентів. Параметр dfactor вказує який метод використовувати для масщтабування кінцевих кольорових компонентів. Можливі методи описані у таблиці, вказаній нижче. Кожен метод визначає чотири множника масштабування, кожен для червоного, зеленого, синього і компоненту прозорості. У таблиці і наступних рівняннях, до джерельний і кінцевий колірних компонентів відносяться як Rs Gs Bs As і Rd Gd Bd Ad. До кольору вказаного за допомогою функції glBlendColor відносяться як Rc Gc Bc Ac. Вони вважаються цілочисельними значеннями між 0 і kR kG kB kA, де kc= 2^mc - 1

і mR mG mB mA являється номером бітових комірок для червоного, зеленого, синього і компоненту прозорості.

Джерельні і кінцеві множники масштабування позначаються як sR sG sB sA і dR dG dB dA. Множники масштабування описані в таблиці, позначені fR fG fB fA, які представляють або джерельний або кінцевий множник. Усі множники масштабування мають проміжок від [0; 1].

Параметр
fR fG fB fA
GL_ZERO0000
GL_ONE1111
GL_SRC_COLORRs/kR Gs/kG Bs/kB As/kA
GL_ONE_MINUS_SRC_COLOR1111 - Rs/kR Gs/kG Bs/kB As/kA
GL_DST_COLORRd/kR Gd/kG Bd/kB Ad/kA
GL_ONE_MINUS_DST_COLOR1111 - Rd/kR Gd/kG Bd/kB Ad/kA
GL_SRC_ALPHAAs/kA As/kA As/kA As/kA
GL_ONE_MINUS_SRC_ALPHA1111 - As/kA As/kA As/kA As/kA
GL_DST_ALPHAAd/kA Ad/kA Ad/kA Ad/ka
GL_ONE_MINUS_DST_ALPHA1111 - Ad/kA Ad/kA Ad/kA Ad/kA
GL_CONSTANT_COLORRc Gc Bc Ac
GL_ONE_MINUS_CONSTANT_COLOR1111 - Rc Gc Bc Ac
GL_CONSTANT_ALPHAAc Ac Ac Ac
GL_ONE_MINUS_CONSTANT_ALPHA1111 - Ac Ac Ac Ac
GL_SRC_ALPHA_SATURATEiiii1

У таблиці, i = (min As kA - Ad) / kA

Для визначення міксованих значень RGBA пікселя під час малювання у режимі RGBA, система використовує наступні рівняння

Rd = min kr Rs sR + Rd dR Gd = min kG Gs sG + Gd dG Bd = min kB Bs sB + Bd dB

Ad = min kA As sA + Ad dA

Не зважаючи на наявну точність у вказаних рівняннях, арифметика змішування не вказується точно, оскільки змішування оперує з неточними цілочисельними значеннями кольорів. Однак, множник змішування, який повинен дорівнювати 1 гарантує, що він не буде модифікувати множене, а множник змішування змуншує його множене до 0. Наприклад, якщо параметр sfactor являється GL_SRC_ALPHA, параметр dfactor являється GL_ONE_MINUS_SRC_ALPHA, і As рівний до kA, рівняння заміняються на простіше:

Rd = Rs Gd = Gs Bd = Bs Ad = As

Приклади

Прозорість найкраще реалізовується використовуючи функцію змішування (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) з примітивами відсортованими з найдальношо до найближчого. Зверніть увагу, що ці обчислення прозорості не вимагають присутність компоненту прозорості у буферу кадру.

Функція змішування з параметрами (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) також корисна для малювання згладжені точки і лінії в звичайному порядку.

Згладжування багатокутників оптимізується за допомогою використання функції (GL_SRC_ALPHA_SATURATE, GL_ONE) з сортованими багатокутниками від найближчого до найдальношо (перегляньте функції glEnable і glDisable і аргумент GL_POLYGON_SMOOTH за більш детальною інформацією про згладжування багатокутників). Кінцеві комірки бітів для компоненту прозорості, який повинен бути присутній для коректного оперування даної функції змішування, зберігає акумульоване перекривання.

Нотатки

Про вхідний (джерельний) компонент прозорості коректно думати як про прозорість матеріалу, яка розміщується в проміжку від 1.0 (KA), яка представляє повну непрозорість, до 0.0 (0), яке представляє повну прозорість матеріалу.

Якщо більш ніж один колірний буфер увімкнено для малювання, система OpenGL виконує змішування окремо для кожного увімкненого буферу, використовуючи вміст цього буферу для кінцевого кольору (перегляньте функцію glDrawBuffer).

Змішування функціонує тільки у режимі малювання RGBA. Воно ігнорується під час колір-індексного малювання.

Константи GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA доступні у системі OpenGL версій 1.4 або вище, або якщо підтримується розширення ARB_imaging у вашій реалізації.

Константи GL_SRC_COLOR і GL_ONE_MINUS_SRC_COLOR доступні для параметра sfactor у системі OpenGL версії 1.4 або вище.

Константи GL_DST_COLOR і GL_ONE_MINUS_DST_COLOR доступні для паретра dfactor у системі OpenGL версії 1.4 або вище.

Помилки

GL_INVALID_ENUM генерується якщо або sfactor або dfactor не містять допустимого значення.

GL_INVALID_OPERATION генерується якщо glBlendFunc викликається між відповідними вилкиками функцій glBegin і glEnd.

Пов'язані параметри

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

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

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

Перегляньте також

glAlphaFunc, glBlendColor, glBlendEquation, glBlendFuncSeparate, glClear, glDrawBuffer, glEnable, glLogicOp, glStencilFunc

Оригінал

https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glBlendFunc.xml