glUseProgram - встановлює програмний об'єкт у якості частини поточного стану рендерингу.

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

void glUseProgram (GLuint program) ;

Параметри

program вказує ідентифікатор програмного об'єкта виконуваний код якого повинен виконуватися у якості поточного стану рендерингу.

Опис

Функція glUseProgram інсталює програмний об'єкт вказаний через значення параметру program у якості частини поточного стану рендернигу. Один або множина виконуваних програм створюються у програмному об'єкті за допомогою прикріплювання до нього шейдерного об'єкта функцією glAttachShader, успішної компіляції шейдерних об'єктів функцією glCompileShader, і успішного компонування програмного об'єкта за допомогою glLinkProgram.

Програмний об'єкт буде містити виконувану програму, яка буде працювати на вертексному процесорі, якщо він містить один або декілька шейдерних об'єктів типу GL_VERTEX_SHADER, який був успішно скомпільованим і скомпонованим. Аналогічно, програмний об'єкт буде містити виконувану програму, яка буде працювати на шейдерному процесорі, якщо вона містить один або декілька шейдерних об'єктів типу GL_FRAGMENT_SHADER, який був успішно скомпільованим і скомпонованим.

Успішне інсталювання виконуваної програм на програмованому процесорі спричинить вимикання відповідних фіксованих функцій OpenGL. Конкретно, якщо програма встановлена на вертексний процесор, буде вимкнено наступний фіксований набір функцій OpenGL:

  • матриця огляду сцени (modelview) не буде застосовуватися до вертексних координат;
  • матриця проекції (projection) не застосовується до вертексних координат;
  • матриці текстур не застосовуються до текстурних координат;
  • нормалі не переносяться у координати огляду;
  • нормалі не масштабуються чи нормалізуються;
  • обчислення нормалізації нормалей GL_AUTO_NORMAL не виконується;
  • текстурні координати не генеруються автоматично;
  • не виконується повертексне освітлення;
  • обчислення колірних поверхонь не виконується;
  • коліріндексне освітлення не виконується;
  • даний список також виконується під час встановлення поточної растрової позиції.

Очікується, що виконувана програма, яка встановлена на вертексному процесорі, реалізує будь-які виклики до бажаного функціоналу з попереднього списку. Аналогічно, якщо виконувана програма встановлена на фрагментному процесорі, вимкнеться наступний фіксований функціонал OpenGL:

  • текстурне середовище і текстурні функції не застосовуються;
  • текстурна програма не застосовується;
  • сумування кольорів не застосовується;
  • димка або туман недоступні.

Знову, очікується, що встановлений шейдер реалізує деякі або усі бажані функції з попереднього списку.

Поки програмний об'єкт є у використанні, програми можуть вільно модифікувати прикріплені шейдерні об'єкти, компілювати прикріплені шейдерні об'єкти, прикріпляти додаткові шейдерні об'єкти, і від'єднювати чи видаляти шейдерні об'єкти. Жодна з цих операцій змінить виконувані програми, які є частиною поточного стану. Однак, перекомпонування програмного об'єкта, який в даний момент використовується, інсталює його у якості частини поточного стану рендерингу, якщо операція компонування завершилась успішно (перегляньте glLinkProgram). Якщо використовуваний в даний момент об'єкт програми скомпонувався невдало, його статус компонування буде встановлено у значення GL_FALSE, але виконувані програми і асоційовані стани залишаться в поточному стані рендерингу, поки наступний виклик функції glUseProgram видалить його з використання. Після того, як вона видалена з використання, вона не може більше стати частиною поточного стану поки компонування не завершиться успіхом.

Якщо програма містить шейдерні об'єкти типу GL_VERTEX_SHADER, але вона не містить шейдерних об'єктів типу GL_FRAGMENT_SHADER, виконувана програма буде інстальована на вертексному процесорі, але фіксована функціональність буде використана для обробки фрагментів. Аналогічно, якщо програма program містить шейдерні об'єкти типу GL_FRAGMENT_SHADER, але вона не містить шейдерних об'єктів типу GL_VERTEX_SHADER, виконувана програма буде встановлена на фрагментному процесорі, але фіксована функціональність буде використовуватись для обробки вертексів. Якщо параметр program містить значення 0, програмовані процесори будуть вимкнені, і буде використовуватись фіксована функціональність для обробки вертексів і фрагментів.

Нотатки

Функція glUseProgram доступна у системі OpenGL версії 2.0 або вище.

Поки програмний об'єкт використовується поточним станом, стан який контролює вимкнену фіксовану функціональність може також оновлюватися за допомогою звичайних викликів OpenGL.

На подобі списків відтворення і текстурних об'єктів, простір імен для програмних об'єктів може розподілятися серед множини контекстів, поки серверна частина контекстів розділяє однаковий адресний простір. Якщо простір імен розподіляється між контекстами, будь-який прикріплений об'єкт і дані асоційовані з даним прикріпленим об'єктом також являються розподіленими.

Програми відповідальні за забезпечення синхронізації між викликами API коли до об'єктів отримується доступ з різних потоків виконання.

Помилки

GL_INVALID_VALUE генерується якщо параметр program містить значення відмінне від нуля або згенерованого системою OpenGL.

GL_INVALID_OPERATION генерується якщо програма program не являється програмним об'єктом.

GL_INVALID_OPERATION генерується якщо програма program не може стати частиною поточного стану.

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

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

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

glGetActiveAttrib з коректним програмним об'єктом і індексом активної змінної атрибутів.

glGetActiveUniform з коректним програмним об'єктом і індексом активної уніфікованої змінної

glGetAttachedShaders з коректним програмним об'єктом.

glGetAttribLocation з коректним програмним об'єктом і ім'ям атрибутної змінної.

glGetProgram з коректним програмним об'єктом і параметром, який необхідно опитати.

glGetProgramInfoLog з коректним програмним об'єктом.

glGetUniform з коректним програмним об'єктом і розміщенням уніфікованої змінної.

glGetUniformLocation з коректним програмним об'єктом і ім'ям уніфікованої змінної.

glIsProgram

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

glAttachShader, glBindAttribLocation, glCompileShader, glCreateProgram, glDeleteProgram, glDetachShader, glLinkProgram, glUniform, glValidateProgram, glVertexAttrib

Оригінал

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