glLinkProgram - компонує програмний об'єкт
C-специфікація
void glLinkProgram (GLuint program) ;
Параметри
program передає ідентифікатор програмного об'єкта, який необхідно зкомпонувати.
Опис
Функція glLinkProgram компонує програмний об'єкт вказаний за допомогою значення параметру program. Якщо шейдерний об'єкт типу GL_VERTEX_SHADER прикріплений до програми program, він буде використовуватися для створення виконуваної програми, яка буде виконуватись на програмованому вертексному процесорі. Якщо будь-який шейдерний об'єкт типу GL_FRAGMENT_SHADER прикріплений до програми program, він буде використовуватися для створення виконуваної програми, яка буде виконуватися на програмованому фрагментному процесорі.
Статус операції компонування буде зберігатися у якості частини стану програмного об'єкта. Це значення буде встановлено у GL_TRUE якщо програмний об'єкт був скомпонований без помилок і готовий до використання, і GL_FALSE в іншому випадку. Він може бути отриманий за допомогою функції glGetProgram з аргументами program і GL_LINK_STATUS.
У якості результату успішної операції компонування, усі активні визначені користувачем уніфіковані змінні, які належать до програми program будуть ініціалізовані у значення 0, і кожній уніфікованій змінній програмного об'єкта буде надано розміщення, яке можна отримати за допомогою виклику функції glGetUniformLocation. Також, будь-які визначені користувачем активні атрибутні змінні, які не були зв'язаними до загального вертексного атрибутного індексу будуть зв'язані з ним.
Компонування програмного об'єкта може завершитись невдало з багатьох причин, як вказано у специфікації шейдерної мови OpenGL (OpenGL Shading Language Specification). Наступний список містить деякі причини, які можуть спричинити помилку компонування.
- Кількість активних атрибутних змінних підтримуваних поточною реалізацією OpenGL вичерпано.
- Обмеження простору зберігання для уніфікованих змінних вичерпано.
- Кількість активних уніфікованих змінних підтримуване поточною реалізацією системи OpenGL вичерпано.
- Обов'язкова функція main відсутня у вертексному або фрагментному шейдері.
- Змінна використовувана у фрагментному шейдері не визначена аналогічним чином (або взагалі не визначена) у вертексному шейдері.
- Адреса до функції або змінної залишилась невизначеною.
- Розподілена глобальна сутність оголошена з двома різними типами або двома різними початковими значеннями.
- Одне або декілька під'єднаних шейдерних об'єктів не було успішно скомпільовано.
- Зв'язування загальної матриці атрибутів спричинило вихід деяких рядків матриці за дозволене обмеження GL_MAX_VERTEX_ATTRIBS.
- Недостатньо безперервної послідовності комірок вертексних атрибутів.
Коли програмний об'єкт був успішно скомпонованим, програмний об'єкт може стати частиною поточного стану за допомогою виклику функції glUseProgram. В залежності від успіху операції компонування, інформаційних журнал програмного об'єкту буде перезаписаний. Інформаційний журнал можна отримати за допомогою виклику функції glGetProgramInfoLog.
Функція glLinkProgram також інсталює згенеровані виконувані програми у якості частини поточного стану рендерингу, якщо операція компонування завершилась успішно і вказаний програмний об'єкт використовується в даний момент у якості попереднього виклику функції glUseProgram. Якщо використовуваний в даний момент програмний об'єкт невдало перекомпоновано, його статус компонування буде встановлено у значення GL_FALSE, але виконувані файли і відповідні стани залишаться частиною поточного стану, поки наступний виклик функції glUseProgram видаляє її з використання. Після видалення з використання, вона не може ставати частиною поточного стану поки знову успішно не перекомпонується.
Якщо програма program містить шейдерні об'єкти типу GL_VERTEX_SHADER але не містять шейдерні об'єкти типу GL_FRAGMENT_SHADER, вертексний шейдер буде скомпонований проти опосередкованого інтерфейсу для фіксованого набору функцій для обробки фрагментів. Аналогічно, якщо програма program містить шейдерні об'єкти типу GL_FRAGMENT_SHADER, але не містить шейдерні об'єкти питпу GL_VERTEX_SHADER, фрагментний шейдер буде скопоновано проти опосередкованого інтерфейсу для фіксованого набору функцій для вертексної обробки.
Інформаційний журнал програмного об'єкту оновлюється і програма ганерується під час операції компонування. Після операції компонування, програми можуть модифікувати під'єднані шейдерні об'єкти, компілювати під'єднані шейдерні об'єкти, від'єднювати шейдерні об'єкти, видаляти шейдерні об'єкти, і під'єднювати додаткові шейдерні об'єкти. Жодне з цих операцій не модифікує інформаційних журнал або програму, яка є частиною програмного об'єкта.
Нотатки
Функція glLinkProgram доступна в системі OpenGL версії 2.0 або вище.
Якщо операція компонування завершилась невдало, будь-яка інформація про попередню операцію компонування є втраченою (тобто, провальне компонування не відновлює старий стан програми program). Деяка інформація все-одно може бути отримана з програми program навіть після неуспішної операції компонування. Перегляньте наприклад glGetActiveAttrib і glGetActiveUniform.
Помилки
GL_INVALID_VALUE генерується якщо параметр program не містить значення згенерованого системою OpenGL.
GL_INVALID_OPERATION генерується якщо параметр program не містить ідентифікатор (ім'я) об'єкта програми.
GL_INVALID_OPERATION генерується якщо glLinkProgram виконується між відповідними викликами функцій glBegin і glEnd.
Пов'язані параметри
glGet з аргументом GL_CURRENT_PROGRAM
glGetActiveAttrib з аргументом program і індексом активної змінної атрибуту.
glGetActiveUniform з аргументом program і індексом активної уніфікованої змінної
glGetAttachedShaders з аргументом program
glGetAttribLocation з аргументом program і ім'ям атрибутної змінної
glGetProgram з аргументами program і GL_LINK_STATUS
glGetProgramInfoLog з аргументом program
glGetUniform з аргументом program і розміщенням уніфікованої змінної
glGetUniformLocation з аргументом program і ім'ям уніфікованої змінної.
Перегляньте також
glAttachShader, glBindAttribLocation, glCompileShader, glCreateProgram, glDeleteProgram, glDetachShader, glUniform, glUseProgram, glValidateProgram
Оригінал
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLinkProgram.xml