void gl(JniformMatrix{21314}fvARBCGLint location.
GLuint count.
GLboolean transpose. const GLfloat *i/)
Функция устанавливает определенную разработчиком uniform-переменную матричного типа из location в значение v. Число в названии функции - размерность матрицы; 2 - матрица 2x2 (4 значения), 3 - матрица 3x3 (9 значений), 4 - матрица 4x4 (16 значений). Если transpose имеет значение Gl_FALSE, матрица ожидается в виде «по столбцам», а если GL_TRUE - «по строкам». Аргумент count обозначает количество передаваемых матриц, если указать 1, значения будут устанавливаться для одной матрицы, если больше 1 - предполагается массив матриц.
Функции gl Uni formli ARB и gl Uni formli vARB - единственные, которые мотут устанавливать значения семплеров (см. раздел 7.8). Попытка установить семплер с помощью другой функции приведет к ошибке.
Ошибки при вызове функции gl Uni formARB могут быть вызваны одной из следующих причин.
□ Нет текущего программного объекта.
□ 1 ocati on указывает неверное расположение uniform-переменной для текущего программного объекта.
□ count превосходит размер указанных переменной или массива.
□ Тип и размер uniform-переменной, определенной в шейдере, не совпадает с типом и размером, указанными в аргументах функции.
Во всех этих случаях изменения значения uniform-переменной не происходит. Нельзя использовать адрес uniform-переменной для чего-либо еще, кроме установки или запроса ее значения. Например, пусть определена некая uniform-ne-ременная как структура, имеющая три поля типа float. Получив адрес п первого поля с помощью функции gl GetEini formLocati onARB, нельзя предполагать, что следующее поле будет находиться по адресу п + 1. Можно запросить адрес г-го элемента массива и потом установить значение в один или несколько элементов этого массива, начиная с г-го элемента, с помощью функции gl Uni formARB, но нельзя взять индекс г, добавить к нему целое Л'-и пытаться установить значение (г + iV)-ro элемента массива. Адрес этого элемента нужно запрашивать отдельно перед тем, как устанавливать его значение. Этот адрес (расположение) не обязательно будет представлять реальный физический адрес в памяти, и приложения, предполагающие это, правильно работать не будут.
Например, пусть в шейдере определена такая структура: struct {
struct
{
float а; float b[10J:
} c[21: vec2 d:
} uniform e; и есть код, определяющий адреса внутри этой структуры:
loci = glGetllniformLocationARB(progObj. "e.d"): //правильно
1ос2 = glfietUnifornLocationAREKprogQbj, "e.c[Q]’’>: // неправильно
1осЗ = glGetUniformLocationARB(progObj, "е.сШ.Ь"): // правильно
1ос4 = glGetUniformLocationARBCpragObj. "e.c[0].b[2]"): // правильно Адрес 1ос2 получить нельзя, так как е. с[0] ссылается на структуру. Пусть теперь нужно установить значение uniform-переменных: