И все же эти два языка имеют много общего. Язык шейдеров OpenGL может даже рассматриваться как некое ответвление языка шейдеров RenderMan. Типы переменных uniform и varying были придуманы для RenderMan и затем позаимствованы для языка шейдеров OpenGL. Выражения, приоритетность операторов в обоих языках очень похожи на используемые в языке С. Ключевые слова i f, el se, while, for, break, return в них совпадают. Список встроенных математических функций языка шейдеров OpenGL практически совпадает с таким же списком языка шейдеров RenderMan.
17.3. Язык OpenGL Shader (ISL)
Язык OpenGL Shader является некоммерческим и его можно загрузить с веб-сайта компании SGI. Версия 3.0 этого пакета совместима с IRIX 6.5 или выше и с RedHat Linux 8.0. OpenGL Shader определяет и язык шейдеров (интерактивный язык шейдеров, или ISL), и набор функций, с помощью которых можно определять шейдеры и использовать их для рендеринга. Этот набор функций стал частью продуктов SGI, таких как SGI OpenGL Performer и SGI OpenGL Volumizer.
Основное преимущество OpenGL Shader в том, что OpenGL API можно использовать как язык ассемблера для выполнения программируемых шейдеров (рис. 17.2). Если графическое аппаратное обеспечение позволяет использовать больше возможностей (например, многотекстурность и программируемость на уровне фрагментов), то считается, что язык ассемблера является более мощным. Последовательность выражений в шейдере ISL может затем транслироваться в один или больше проходов рендеринга. На каждом проходе может происходить обработка геометрической информации (операции над вершинами, фрагментами, растеризация), или копирование (копируется часть буфера кадров), или копирование текстуры (часть буфера кадров копируется в текстуру для операций, выполняемых раздельно с каждым пикселом). Для определения типа прохода последовательности команд и уменьшения количества проходов используется оптимизация компилятора. Текущая версия OpenGL Shader оптимизирована под многие графические ускорители и платформы и позволяет для каждой из них уменьшать количество проходов.
Подобно любому языку шейдеров, ISL основан на языке С. Но шейдеры ISL выглядят совсем не так, как шейдеры OpenGL. Множество команд в шейдере ISL подразумевают какой-либо конкретный вид прохода. Например, вот фрагмент кода на ISL:
varying color b;
FB = diffuseO:
FB *= color(.5, .2, 0. 1):
b = FB:
FB = specular(30.0):
FB += b: Идентификатор FB обозначает, что результат должен сохраняться в буфере кадров. Эта последовательность операций сначала вызывает шейдерную подпрограмму, которая выполняет шейдер освещения для вычисления рассеянного цвета. Полученное значение умножается на значение цвета (0.5, 0.2, 0, 1), затем результат сохраняется в области текстурной памяти Ь. После этого вычисляется зеркальное отражение и, наконец, компоненты рассеянного и зеркального отражений складываются. Хотя этот код и выглядит требующим многопроходности, последовательность команд может быть выполнена за один проход на множестве разных графических акселераторов.