API языка шейдеров OpenGL
Ошибки при вызове функции gl Uni formARB могут быть вызваны одной из следующих причин.
□ Нет текущего программного объекта.
□ 1 ocation указывает неверное расположение uniform-переменной для текущего программного объекта.
□ count превосходит размер указанных переменной или массива.
□ Тип и размер uniform-переменной, определенной в шейдере, не совпадает с типом и размером, указанными в аргументах функции.
Во всех этих случаях изменения значения ишТогт-переменной не происходит.
Нельзя использовать адрес uniform-переменной для чего-либо еще, кроме установки или запроса ее значения. Например, пусть определена некая uniform-переменная как структура, имеющая три поля типа float. Получив адрес п первого поля с помощью функции gl GetUni formLocati onARB, нельзя предполагать, что следующее поле будет находиться по адресу п + 1. Можно запросить адрес г-го элемента массива и потом установить значение в один или несколько элементов этого массива, начиная с г-го элемента, с помощью функции gl Uni formARB, но нельзя взять индекс і, добавить к нему целое N и пытаться установить значение (г + N)-ro элемента массива. Адрес этого элемента нужно запрашивать отдельно перед тем, как устанавливать его значение. Этот адрес (расположение) не обязательно будет представлять реальный физический адрес в памяти, и приложения, предполагающие это, правильно работать не будут.
Например, пусть в шейдере определена такая структура:
struct
{
struct {
float а;
float b[10J: } c[2]: vec2 d: } uniform e;
и есть код, определяющий адреса внутри этой структуры:
loci = glGetUniformLocationARB(progObi. "e.d"): //правильно
1ос2 = glfietUniformLocationARB(progObj. "е.сШ"): // неправильно
1осЗ = glGetUniformLocationARB(progObj, "е.сШ.Ь"): // правильно
1ос4 = glGetUniformLocationARBCprogObj. "e.c[0].b[2]"): // правильно Адрес 1ос2 получить нельзя, так как е.с[0] ссылается на структуру. Пусть теперь нужно установить значение uniform-переменных: