допускается, пока выполняется одно из следующих условий:
1. Перед ссылкой на массив в программе он объявлен еще раз с указанием размера такого асе типа, как в предыдущем объявлении, например:
vec4 points[]: // points - массив неизвестного размера
vec4 points[10]: // points - массив размером 10 элементов Но нельзя объявлять этот же массив еще раз:
vec4 points[]; // points - массив неизвестного размера ■
vec4 points[10]; // points - массив размером 10 элементов
vec4 points[20]; // это недопустима vec4 points[]; // это тоже недопустимо
2. Все индексы, ссылающиеся на массив, - константы времени компиляции. При этом компилятор может увеличивать массив, чтобы он мог вместить все элементы с используемыми в программе индексами, например:
vec4 points[]: // points - массив неизвестного размера
points[2] = vec4(1.0): // points - массив размером 3 элемента
points[7] ” vec4(2,G); И points стал массивом на 8 элементов В приведенном примере после компиляции в программе будет находиться вектор размером 8 элементов. Окончательный размер массива определяется указанием максимального индекса.
Эти возможности особенно полезны для работы со встроенными массивами текстурных координат. Внутри OpenGL массив объявлен без указания индекса: varying vec4 g1_TexCoord[]: Если программа указывает только константы 0 и 1, которые определяются во время компиляции, массиву будет неявно присвоен размер 2 элемента: gl _ТехСоо rd [ 2 ]. Если же шейдер для обращения к массиву использует неконстантные переменные, он должен объявить массив явно и указать нужный размер. Желательно объявлять массив не больший, чем это необходимо, так как размер аппаратных ресурсов здесь ограничен.
Если несколько шейдеров совместно используют один массив, он может оказаться объявленным разного размера. В этом случае компоновщик сделает размер массива соответствующим максимальному объявлению.
3.2.7. Void
Тип void традиционно используется для объявления того, что функция не возвращает никакого значения. В данном примере функция main ничего не возвращает и объявлена как тип void: void main()
{
Г
Для других целей этот тип не используется.
3.2.8. Объявления и область видимости
Объявления переменных в языке шейдеров OpenGL такие же, как в C++. Переменные могут быть объявлены по необходимости, а не в начале блока и имеют такую же область видимости, например:
float f: f = 3.0: vec4 и. v:
for (int i = 0; i < 10: ++i) v = f * u + v: Область видимости переменной, объявленной в операторе for, заканчивается в конце тела цикла. Переменные нельзя объявлять в операторе i f, что упрощает реализацию определения области действия в операторе el se и делает ее лишь чуть менее удобной.