Модель выполнения Microsoft HLSL

Рис. 17.3. Модель выполнения Microsoft HLSL

Типы данных в HLSL почти такие же, как в языке шейдеров OpenGL, с небольшими отличиями. HLSL включает поддержку чисел с плавающей запятой половинной и двойной точности. Как и в языке шейдеров OpenGL, поддерживаются векторы, матрицы, структуры и массивы. Выражения в HLSL такие же, как в языках С и C++. Определенные разработчиком функции и условные операторы поддерживаются так же, как и в языке шейдеров OpenGL. Операторы циклов (for, do, while) определены, но, согласно последней документации, не реализованы. HLSL поддерживает гораздо большее количество встроенных функций, чем язык шейдеров OpenGL, а те, что имеются в обоих списках, практически совпадают.

Еще одно отличие - в способе передачи данных между вершинным и пиксельным (HLSL) или фрагментным (язык шейдеров OpenGL) шейдерами. HLSL определяет семантику и входных, и выходных данных как для вершинного, так и для пиксельного шейдеров. Это то же самое, что varying- и встроенные переменные в языке шейдеров OpenGL. Можно передавать любые данные в шейдеры и из них, но нужно записывать эти данные в определенные области памяти: POSITION, C0L0R[i ], TEXC00RD[i ] и т. д. Например, если направление освещения содержится в переменной lightdir, ее нужно записать в «гнездо» TEXC00RD[i] - это, вообще, довольно странный прием для высокоуровневого языка программирования. Язык шейдеров OpenGL позволяет использовать произвольно выбранные имена для передачи значений между шейдерами.

HLSL был спроектирован для DirectX, графического API от компании Microsoft, а язык шейдеров OpenGL - для OpenGL. Microsoft может изменять DirectX как вздумается, a OpenGL является открытым кроссплатформенным стандартом, который меняется более медленно, но сохраняет совместимость с предыдущими версиями.

17.5. Язык Сд

Cg является высокоуровневым языком шейдеров, очень похожим на HLSL. Cg определен, реализован и поддерживается компанией NVIDIA. Можно сравнить Cg с языком шейдеров OpenGL почти так же, как последний - с HLSL. Между Cg и HLSL существует несколько небольших различий (например, в HLSL есть тип данных двойной точности, а в Cg - нет), но эти языки разрабатывались компаниями совместно, так что и результаты их работы получились практически одинаковыми.

Однако у Cg есть преимущества перед другими языками. Транслятор Cg может выдавать код как для DirectX, так и для OpenGL. Таким образом, шейдеры Cg могут использоваться и на базе DirectX, и на базе OpenGL (рис. 17.4). При этом требуется, чтобы приложение обращалось к промежуточной библиотеке от NVIDIA - посреднику между приложением и соответствующим API (OpenGL или DirectX). Эта библиотека называется Cg Runtime. Для простых приложений использование библиотеки довольно просто, но в более сложных приложениях управлять шейдерами становится нелегко.

NVIDIA предоставляет собственную версию надстройки над языком. CgFX - это спецификация шейдеров и формат данных, а формат файлов там такой же, как и .fx-формат, поддерживаемый DirectX 9. Библиотека CgFX, как и Cg Runtime, включает поддержку и OpenGL и DirectX.


⇐ вернуться назад | | далее ⇒