Гарантировано, что целое число может быть не меньшей, чем 16 бит точности; оно может быть положительным, отрицательным, нулем; арифметические операции, аргументы и результат которых не превышают заданной точности, всегда дают ожидаемый результат. Точность здесь подразумевает использование 16 бит и знака числа, так что полный диапазон может быть [-65535, 65535] или даже больше.
Целые числа в языке шейдеров OpenGL, как и в языке С, могут быть представлены в десятичном, восьмеричном или шестнадцатеричном виде.
42 /У представление десятичного целого
052 // представление восьмеричного целого
0х2А // представление целого в шестнадцатеричном виде Для целых чисел тоже не используются суффиксы, так как целочисленный тип - единственный. Целые числа служат для обозначения размеров структур или массивов или используются в качестве счетчиков. А графические величины, например цвет или координаты, представлять в шейдере лучше всего числами с плавающей запятой.
Здесь булевы переменные, как и в C++, называются bool. Они могут иметь одно из двух значений: «истина» или «ложь«>. Для их обозначения существует две константы: true и false. Результатом операторов отношения, таких как «меньше» (<), и логических операторов, таких как «логическое И» (&&), всегда является логическое значение. Конструкции языка типа i f-el se принимают только выражения булева типа. В этом отношении язык шейдеров OpenGL ограничивает разработчиков больше, чем C++.
3.2,2. Векторы
В языке шейдеров OpenGL есть встроенные типы векторов из чисел с плавающей запятой (float), целых (int) или булевых (bool). Существуют разные типы для двух-, трех- и четырехэлементных векторов:
□ vec2 - вектор из двух чисел с плавающей запятой;
□ v.ec3 - вектор из трех чисел с плавающей запятой;
□ vec4 - вектор из четырех чисел с плавающей запятой;
□ i vec2 - вектор из двух целых;
□ i vec3 - вектор из трех целых;
□ i vec4 - вектор из четырех целых;
□ bvec2 - вектор из двух булевых значений;
□ bvec3 - вектор из трех булевых значений;
□ bvec4 - вектор из четырех булевых значений.
Встроенные векторы очень полезны - в них удобно хранить цвет, координаты вершин и текстур и т. п. Встроенные переменные и функции, использующие эти типы, делают их необходимыми. Для встроенных сложных типов поддерживаются операции над ними, и в графических ускорителях могут быть предусмотрены специальные возможности обработки векторов, например зеркальное отражение векторных выражений в шейдерах.
Компилятор не способен самостоятельно отличить вектор цвета ИЛИ координат от вектора с другими значениями. С точки зрения языка все они - лишь векторы чисел с плавающей запятой.
Элементы вектора можно адресовать как по именам (как в структурах), так и по индексам (как в массивах). Например, пусть posi ti on - переменная типа vec3, она трактуется как вектор (лг, у, z), и к первому элементу вектора можно обратиться position, х.