glVertexAttrib - встановлює значення загального вертексного атрибуту.

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

void glVertexAttrib1f (GLuint index,
 	               GLfloat v0) ;
 
void glVertexAttrib1s (GLuint index,
                       GLshort v0) ;
 
void glVertexAttrib1d (GLuint index,
                       GLdouble v0) ;
 
void glVertexAttrib2f (GLuint index,
                       GLfloat v0,
                       GLfloat v1) ;
 
void glVertexAttrib2s (GLuint index,
                       GLshort v0,
                       GLshort v1) ;
 
void glVertexAttrib2d (GLuint index,
                       GLdouble v0,
                       GLdouble v1) ;
 
void glVertexAttrib3f (GLuint index,
                       GLfloat v0,
                       GLfloat v1,
                       GLfloat v2) ;
 
void glVertexAttrib3s (GLuint index,
                       GLshort v0,
                       GLshort v1,
                       GLshort v2) ;
 
void glVertexAttrib3d (GLuint index,
                       GLdouble v0,
                       GLdouble v1,
                       GLdouble v2) ;
 
void glVertexAttrib4f (GLuint index,
                       GLfloat v0,
                       GLfloat v1,
                       GLfloat v2,
                       GLfloat v3) ;
 
void glVertexAttrib4s (GLuint index,
                       GLshort v0,
                       GLshort v1,
                       GLshort v2,
                       GLshort v3) ;
 
void glVertexAttrib4d (GLuint index,
                       GLdouble v0,
                       GLdouble v1,
                       GLdouble v2,
                       GLdouble v3) ;
 
void glVertexAttrib4Nub (GLuint index,
                         GLubyte v0,
                         GLubyte v1,
                         GLubyte v2,
                         GLubyte v3) ;


void glVertexAttrib1fv (GLuint index,
                        const GLfloat *v) ;
 
void glVertexAttrib1sv (GLuint index,
                        const GLshort *v) ;
 
void glVertexAttrib1dv (GLuint index,
                        const GLdouble *v) ;
 
void glVertexAttrib2fv (GLuint index,
                        const GLfloat *v) ;

void glVertexAttrib2sv (GLuint index,
                        const GLshort *v) ;
 
void glVertexAttrib2dv (GLuint index,
                        const GLdouble *v) ;
 
void glVertexAttrib3fv (GLuint index,
                        const GLfloat *v) ;
 
void glVertexAttrib3sv (GLuint index,
                        const GLshort *v) ;
 
void glVertexAttrib3dv (GLuint index,
                        const GLdouble *v) ;
 
void glVertexAttrib4fv (GLuint index,
                        const GLfloat *v) ;
 
void glVertexAttrib4sv (GLuint index,
                        const GLshort *v) ;
 
void glVertexAttrib4dv (GLuint index,
                        const GLdouble *v) ;
 
void glVertexAttrib4iv (GLuint index,
                        const GLint *v) ;
 
void glVertexAttrib4bv (GLuint index,
                        const GLbyte *v) ;
 
void glVertexAttrib4ubv (GLuint index,
                         const GLubyte *v) ;
 
void glVertexAttrib4usv (GLuint index,
                         const GLushort *v) ;
 
void glVertexAttrib4uiv (GLuint index,
                         const GLuint *v) ;
 
void glVertexAttrib4Nbv (GLuint index,
                         const GLbyte *v) ;
 
void glVertexAttrib4Nsv (GLuint index,
                         const GLshort *v) ;
 
void glVertexAttrib4Niv (GLuint index,
                         const GLint *v) ;
 
void glVertexAttrib4Nubv (GLuint index,
                          const GLubyte *v) ;
 
void glVertexAttrib4Nusv (GLuint index,
                          const GLushort *v) ;
 
void glVertexAttrib4Nuiv (GLuint index,
                          const GLuint *v) ;

 

Параметри

index вказує індекс загального вертексного атрибуту, який необхідно модифікувати.

v0, v1, v2, v3 вказують нові значення, які необхідно використати для вказаних вертексних атрибутів.

v вказує вказівник на масив значень, які необхідно використати для загального вертексного атрибуту.

Опис

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

Загальні атрибути визначені у якості значень чотирьох компонентів, які організовані у масив. Перша точка входу цього масиву має номер 0, і розмір цього масиву вказується за допомогою реалізаційно залежної константи GL_MAX_VERTEX_ATTRIBS. Індивідуальні елементи цього масиву можуть модифікуватися за допомогою виклику glVertexAttrib, який вказує індекс елементу для модифікування і значення для цього елементу.

Дані команди можуть використовуватися для вказування одного, двох, трьох або усіх чотирьох компонентів загальних вертексного атрибуту вказаного за допомогою index. Одиниця в імені команди вказує на те, що передається тільки одне значення, і воно буде використане для зміни першого компоненту загального вертексного атрибуту. Другий і третій компонент будуть встановлені у значення 0, і четвертий компонент буде містити значення 1. Аналогічно, двійка в назві команди вказує, що значення передані для перших двох компонентів, і третій компонент буде містити значення 0, і четвертий компонент встановлюється в значення 1. Трійка в назві команди вказує, що значення передані першим трьом компонентам, а четвертий компонент буде містити значення 1, коли четвірка у назві вказує, що значення передані для усіх чотирьох компонентів.

Літери s, f, i, d, ub, us і ui вказують на тип аргументу, які є відповідно short, float, int, double, unsigned byte, unsigned short, або unsigned int. Коли літера v додана до імені команди, команди можуть отримувати вказівник на масив даних значень. Команди, які містять літеру N вказуються, що аргументи будуть передані у якості значень з фіксованою крапкою, які масштабуються до нормального проміжку відповідно до правил компонентів визначених за допомогою специфікацій систем OpenGL. Вважається що знакові числа представляють значення з фіксованою крапкою у проміжку [-1; 1], а беззнакові цілі значення вважаються значеннями фіксованою точкою у проміжку [0; 1].

Дозволяється, що змінні атрибутів шейдерної мови OpenGL (OpenGL Shading Language) можуть мати тип mat2, mat3 або mat4. Атрибути цих типів можуть завантажуватися використовуючи функції сімейства glVertexAttrib. Матриці повинні завантажуватися у відповідні комірки загальних атрибутів у порядку головуючих колонок, з однією колонкою матриці для кожної комірки загального атрибуту.

Змінні атрибутів визначені користувачем у вертексному шейдері можуть зв'язуватися до загального атрибутного індексу за допомогою виклику glBindAttribLocation. Це дозволяє програмі використовувати більш зрозумілі імена змінних у вертексному шейдері. Наступна зміна до загального вертексного атрибуту буде негайно відображена у якості зміни до відповідного атрибутної змінної у вертексному шейдері.

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

Загальний вертексний атрибут за індексом 0 являється таким самим як вертексна позиція атрибуту попередньо визначеної у OpenGL. Команди glVertex2, glVertex3 або glVertex4 являються повністю еквівалентними до відповіданих команд glVertexAttrib з індексним аргументом з значенням 0. Вертексний шейдер може отримувати доступ до вертексного атрибуту за індексом 0, за допомогою використання вбудованої змінної атрибуту gl_Vertex. Немає поточних значень для загального вертексного атрибуту за індексом 0. Він являється єдиним вертексним атрибутом з цією властивістю; виклик для встановлення інших стандартних атрибутів можуть вільно змішуватися з викликами для встановлення будь-яких інших значень загальних вертексних атрибутів.

Нотатки

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

Загальні вертексні атрибути можуть оновлюватися в любий момент. Конкретно, функція glVertexAttrib може викликатися між відповідними викликами функцій glBegin і glEnd.

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

Немає можливості для зв'язування стандартних вертексних атрибутів; отже, неможливо зв'язувати загальні атрибути з стандартними атрибутами.

Помилки

GL_INVALID_VALUE генерується якщо index містить значення більше ніж або рівним обмеженню GL_MAX_VERTEX_ATTRIBS.

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

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

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

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

glGetVertexAttrib з аргументами GL_CURRENT_VERTEX_ATTRIB і index.

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

glBindAttribLocation, glVertex, glVertexAttribPointer

Оригінал

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