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-переменных:


⇐ Предыдущая| |Следующая ⇒