Cg (язык программирования)
Семья | язык штриховки |
---|---|
Разработчик | нвидиа, майкрософт |
Веб-сайт | разработчик |
Диалекты | |
Cg, HLSL, язык шейдеров PlayStation | |
Под влиянием | |
C , язык шейдеров RenderMan | |
Под влиянием | |
ГЛСЛ |
Cg (сокращение от C для графики ) и язык шейдеров высокого уровня высокого уровня, (HLSL) — это два названия, данные языку шейдеров разработанному Nvidia и Microsoft для программирования шейдеров . Cg/HLSL основан на языке программирования C , и хотя они имеют один и тот же основной синтаксис, некоторые функции C были изменены и добавлены новые типы данных, чтобы сделать Cg/HLSL более подходящим для программирования графических процессоров . [ 1 ] [ 2 ]
Существуют две основные ветви языка Cg/HLSL: компилятор Nvidia Cg (cgc), который выводит DirectX или OpenGL , и Microsoft HLSL, который выводит шейдеры DirectX в формате байт-кода. [ 3 ] [ 4 ] CGC от Nvidia был объявлен устаревшим в 2012 году, без каких-либо дополнительных разработок или поддержки. [ 5 ]
Шейдеры HLSL могут обеспечивать множество специальных эффектов как в 2D, так и в 3D компьютерной графике . Язык Cg/HLSL изначально включал поддержку только вершинных и пиксельных шейдеров , но постепенно вводились и другие типы шейдеров:
- В DirectX 10 (Shader Model 4) и Cg 2.0 появились геометрические шейдеры . [ 6 ]
- В DirectX 11 (Shader Model 5) представлены вычислительные шейдеры ( GPGPU ) и шейдеры тесселяции (оболочка и домен). Последний присутствует в Cg 3.1.
- В DirectX 12 (модель шейдеров 6.3) представлены шейдеры трассировки лучей (генерация лучей, пересечение, бит/ближайшее попадание/промах).
Фон
[ редактировать ]Из-за технического прогресса в области графического оборудования некоторые области программирования 3D-графики стали довольно сложными. Чтобы упростить процесс, к видеокартам были добавлены новые функции, в том числе возможность изменять их конвейеры рендеринга с помощью вершинных и пиксельных шейдеров.
Вначале вершинные и пиксельные шейдеры программировались на очень низком уровне, используя только ассемблер графического процессора. Хотя использование языка ассемблера давало программисту полный контроль над кодом и гибкость, его было довольно сложно использовать. Требовался портативный язык более высокого уровня для программирования графического процессора, поэтому был создан Cg, чтобы преодолеть эти проблемы и упростить разработку шейдеров.
Некоторые из преимуществ использования Cg перед ассемблером:
- Код высокого уровня легче изучать, программировать, читать и поддерживать, чем ассемблерный код.
- Код Cg переносим на широкий спектр оборудования и платформ, в отличие от ассемблерного кода, который обычно зависит от оборудования и платформ, для которых он написан.
- Компилятор Cg может оптимизировать код и автоматически выполнять задачи более низкого уровня, которые сложно выполнить и подвержены ошибкам при сборке.
Язык
[ редактировать ]Типы данных
[ редактировать ]Cg имеет шесть основных типов данных. Некоторые из них такие же, как в C, а другие добавлены специально для программирования на графическом процессоре. Эти типы:
- float — 32-битное число с плавающей запятой.
- половина - 16-битное число с плавающей запятой
- int — 32-битное целое число
- фиксированный - 12-битное число с фиксированной запятой
- bool — логическая переменная
- сэмплер* — представляет объект текстуры
Cg также поддерживает векторные и матричные типы данных, основанные на базовых типах данных, таких как float3 и float4x4. Такие типы данных довольно распространены при программировании трехмерной графики. struct и В Cg также есть типы данных array , которые работают аналогично их эквивалентам в C.
Операторы
[ редактировать ]Cg поддерживает широкий спектр операторов, включая общие арифметические операторы из C, эквивалентные арифметические операторы для векторных и матричных типов данных, а также общие логические операторы .
Функции и структуры управления
[ редактировать ]Cg разделяет базовые структуры управления с C, например, if/else, while и for. Он также имеет аналогичный способ определения функций.
Семантика
[ редактировать ]Препроцессор
[ редактировать ]Cg реализует множество директив препроцессора C и систему расширения макросов. Он реализует #include
. [ 7 ]
Возможности HLSL
[ редактировать ]- Пространство имен
- Аннотация
Среда
[ редактировать ]Цели компиляции
[ редактировать ]Программы Cg созданы для разных профилей шейдеров , которые соответствуют графическим процессорам с разными возможностями. [ 8 ] Эти профили решают, среди прочего, сколько инструкций может быть в каждом шейдере, сколько регистров доступно и какие ресурсы может использовать шейдер. Даже если программа правильная, работать с профилем может быть слишком сложно. [ 7 ]
По мере увеличения количества типов профилей и шейдеров Microsoft перешла на использование термина «Модель шейдеров» для группировки набора профилей, встречающихся в поколении графических процессоров. [ 9 ] Cg поддерживает некоторые новые профили до Shader Model 5.0, а также перевод в glsl или hlsl. [ 8 ]
Версия пиксельного шейдера | от 1,0 до 1,3 [ 10 ] | 1.4 [ 10 ] | 2.0 [ 10 ] [ 11 ] | 2.0а [ 10 ] [ 11 ] [ 12 ] | 2.0б [ 10 ] [ 11 ] [ 13 ] | 3.0 [ 10 ] [ 14 ] | 4.0 [ 15 ] 4.1 [ 16 ] 5.0 [ 17 ] |
---|---|---|---|---|---|---|---|
Зависимый предел текстуры | 4 | 6 | 8 | Безлимитный | 8 | Безлимитный | Безлимитный |
Предел инструкций текстуры | 4 | 6*2 | 32 | Безлимитный | Безлимитный | Безлимитный | Безлимитный |
Регистр позиций | Нет | Нет | Нет | Нет | Нет | Да | Да |
Слоты инструкций | 8+4 | 8+4 | 32 + 64 | 512 | 512 | ≥ 512 | ≥ 65536 |
Выполненные инструкции | 8+4 | 6*2+8*2 | 32 + 64 | 512 | 512 | 65536 | Безлимитный |
Косвенные текстуры | 4 | 4 | 4 | Безлимитный | 4 | Безлимитный | Безлимитный |
Интерполированные регистры | 2 + 4 | 2 + 6 | 2 + 8 | 2 + 8 | 2 + 8 | 10 | 32 |
Предсказание инструкций | Нет | Нет | Нет | Да | Нет | Да | Нет |
Индексные входные регистры | Нет | Нет | Нет | Нет | Нет | Да | Да |
Временные регистры | 2 | 6 | с 12 до 32 | 22 | 32 | 32 | 4096 |
Постоянные регистры | 8 | 8 | 32 | 32 | 32 | 224 | 16×4096 |
Произвольное вращение | Нет | Нет | Нет | Да | Нет | Да | Да |
Инструкции по градиенту | Нет | Нет | Нет | Да | Нет | Да | Да |
Регистр счетчика циклов | Нет | Нет | Нет | Нет | Нет | Да | Да |
Регистрация лица (двустороннее освещение) | Нет | Нет | Нет | Нет | Да | Да | Да |
Динамическое управление потоком | Нет | Нет | Нет | Нет | Нет | Да (24) | Да (64) |
Побитовые операторы | Нет | Нет | Нет | Нет | Нет | Нет | Да |
Собственные целые числа | Нет | Нет | Нет | Нет | Нет | Нет | Да |
- PS 1.0 — неизданная версия 3dfx Rampage, DirectX 8.
- PS 1.1 — GeForce 3 , DirectX 8.
- PS 1.2 — 3Dlabs Wildcat VP, DirectX 8.0a.
- PS 1.3 — GeForce 4 Ti , DirectX 8.0a.
- PS 1.4 — Радеон 8500-9250 , Matrox Parhelia , DirectX 8.1.
- Модель шейдеров 2.0 — Radeon 9500-9800/X300-X600 , DirectX 9.
- Shader Model 2.0a — модель, оптимизированная для GeForce FX/PCX , DirectX 9.0a.
- Shader Model 2.0b — Radeon X700-X850 , DirectX 9.0b. шейдерная модель
- Модель шейдеров 3.0 — Radeon X1000 и GeForce 6 , DirectX 9.0c.
- Модель шейдеров 4.0 — Radeon HD 2000 и GeForce 8 , DirectX 10.
- Шейдерная модель 4.1 — Radeon HD 3000 и GeForce 200 , DirectX 10.1.
- Модель шейдеров 5.0 — Radeon HD 5000 и GeForce 400 , DirectX 11.
- Модель шейдера 5.1 — GCN 1+ , Fermi+, DirectX 12 (11_0+) с WDDM 2.0.
- Модель шейдеров 6.0 — GCN 1+, Kepler+, DirectX 12 (11_0+) с WDDM 2.1.
- Модель шейдера 6.1 — GCN 1+, Kepler+, DirectX 12 (11_0+) с WDDM 2.3.
- Модель шейдера 6.2 — GCN 1+, Kepler+, DirectX 12 (11_0+) с WDDM 2.4.
- Модель шейдера 6.3 — GCN 1+, Kepler+, DirectX 12 (11_0+) с WDDM 2.5.
- Модель шейдера 6.4 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11_0+) с WDDM 2.6.
- Модель шейдера 6.5 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11_0+) с WDDM 2.7.
«32 + 64» для выполняемых инструкций означает «32 текстурные инструкции и 64 арифметические инструкции».
Версия вершинного шейдера | ПРОТИВ 1.1 [ 18 ] | ПРОТИВ 2.0 [ 11 ] [ 18 ] [ 19 ] | ПРОТИВ 2.0а [ 11 ] [ 18 ] [ 19 ] | ПРОТИВ 3.0 [ 14 ] [ 18 ] | ПРОТИВ 4.0 [ 15 ] ПРОТИВ 4.1 [ 20 ] ПРОТИВ 5.0 [ 17 ] |
---|---|---|---|---|---|
Количество слотов инструкций | 128 | 256 | 256 | ≥ 512 | ≥ 65536 |
Максимальное количество выполненных инструкций | 128 | 1024 | 65536 | 65536 | Безлимитный |
Предсказание инструкций | Нет | Нет | Да | Да | Да |
Временные регистры | 12 | 12 | 16 | 32 | 4096 |
# константные регистры | ≥ 96 | ≥ 256 | 256 | ≥ 256 | 16×4096 |
Статический контроль потока | Нет | Да | Да | Да | Да |
Динамическое управление потоком | Нет | Нет | Да | Да | Да |
Динамическая глубина контроля потока | — | — | 24 | 24 | 64 |
Получение текстуры вершин | Нет | Нет | Нет | Да | Да |
Количество сэмплеров текстур | — | — | — | 4 | 128 |
создания экземпляров геометрии Поддержка | Нет | Нет | Нет | Да | Да |
Побитовые операторы | Нет | Нет | Нет | Нет | Да |
Собственные целые числа | Нет | Нет | Нет | Нет | Да |
Стандартная библиотека
[ редактировать ]Как и в C, Cg/HLSL имеет набор функций для общих задач программирования на графическом процессоре. Некоторые функции имеют эквиваленты на языке C, например математические функции abs и sin, в то время как другие специализируются на задачах программирования графического процессора, например функции отображения текстур tex1D и tex2D.
Библиотека времени выполнения Cg
[ редактировать ]Программы Cg — это всего лишь вершинные и пиксельные шейдеры, и им нужны вспомогательные программы, которые выполняют остальную часть процесса рендеринга. Cg можно использовать с двумя графическими API : OpenGL или DirectX . Каждый из них имеет свой собственный набор функций Cg для взаимодействия с программой Cg, таких как установка текущего шейдера Cg, передача параметров и тому подобные задачи.
Помимо возможности компилировать исходный код Cg в ассемблерный код, среда выполнения Cg также имеет возможность компилировать шейдеры во время выполнения вспомогательной программы. Это позволяет среде выполнения компилировать шейдер с использованием последних оптимизаций, доступных для оборудования, на котором в данный момент выполняется программа. Однако этот метод требует, чтобы исходный код шейдера был доступен компилятору в виде обычного текста, что позволяет пользователю программы получить доступ к исходному коду шейдера. Некоторые разработчики считают это серьезным недостатком этого метода.
Чтобы избежать раскрытия исходного кода шейдера и при этом сохранить некоторые аппаратные оптимизации, была разработана концепция профилей. Шейдеры могут быть скомпилированы для разных графических аппаратных платформ (в соответствии с профилями). При выполнении вспомогательной программы загружается лучший/наиболее оптимизированный шейдер в соответствии с его профилем. Например, может существовать профиль для видеокарты, поддерживающей сложные пиксельные шейдеры, и другой профиль для карты, поддерживающей только минимальные пиксельные шейдеры. Создавая пиксельный шейдер для каждого из этих профилей, вспомогательная программа увеличивает количество поддерживаемых аппаратных платформ, не жертвуя при этом качеством изображения на мощных системах».
Составители и диалекты
[ редактировать ]Диалект Cg когда-либо имел только один компилятор — набор инструментов Cg от Nvidia.
Microsoft выпустила два компилятора для HLSL. Исходным компилятором был FXC (Effect Compiler) с закрытым исходным кодом, который поддерживался до 2015 года. Он был устаревшим в пользу DXC с открытым исходным кодом на основе LLVM (DirectXShaderCompiler) с поддержкой новых функций HLSL. [ 21 ] Оба компилятора генерируют байт-код: в то время как старый FXC использовал DXBC, теперь DXC использует DXIL. DXC также может генерировать байт-код SPIR-V . [ 22 ]
Группа Khronos также написала компилятор HLSL на основе LLVM в форме интерфейса для glslang , их компилятора GLSL-to-SPIR_V. Поддержка SPIR-V означает, что шейдеры могут быть кроссплатформенными, не ограничиваясь стеком DirectX. [ 23 ] Ранее эту задачу выполняли преобразователи уровня исходного кода, такие как HLSL2GLSL , но результирующий код часто оказывался раздутым. [ 24 ]
Производные языки
[ редактировать ]Язык шейдинга PlayStation основан на Cg/HLSL. [ 25 ]
Язык шейдеров ReshadeFX также основан на Cg/HLSL. Шейдеры, написанные в ReshadeFX, компилируются в OpenGL, DX или Vulkan и внедряются в игры в качестве фильтров постобработки. [ 26 ]
Приложения и игры, использующие Cg или HLSL
[ редактировать ]- Виртуальные инструменты 3DVIA
- Adobe Фотошоп
- Майя [ 27 ]
- Поле битвы 2
- Кристальное пространство
- Дельфини-гонщик
- Спецназ Земли — мод для Half-Life
- Вражеская территория: Quake Wars
- Doom 3: издание BFG
- EON Professional™/Ultra™ из EON Reality
- глаз Фьюжн
- Большая разница
- Гаршасп: Убийца монстров
- GLScene
- Пистолетный металл
- Хитмэн: Кровавые деньги
- Иррлихт Двигатель
- Лига Легенд
- Движок Lightfeather 3D
- ЛайтВейв 11.6 [ 28 ]
- Muvee Раскрыть
- ОГРЕ
- OpenEmu
- Панда3D
- PCSX2
- PlayStation 3
- РетроАрка
- РУСЕ
- Снес9х
- игровой движок Unity [ 29 ]
- Нереальный движок
См. также
[ редактировать ]- Компьютерное программирование
- Компьютерная графика
- Вершинные и пиксельные шейдеры
- Язык шейдеров высокого уровня
- язык шейдеров OpenGL
- Шейдерная модель
- OpenGL
- ДиректХ
Ссылки
[ редактировать ]- ^ «Fusion Industries :: Часто задаваемые вопросы по Cg и HLSL ::» . 24 августа 2012 г. Архивировано из оригинала 24 августа 2012 г.
- ^ «Учебное пособие по компьютерной графике. Глава 1. Введение» . Developer.download.nvidia.cn .
- ^ «Написание шейдеров HLSL в Direct3D 9 (Windows)» . msdn.microsoft.com . 24 мая 2021 г.
- ^ «Часто задаваемые вопросы по CG» . NVIDIA DesignWorks . 8 марта 2011 года . Проверено 25 мая 2017 г.
- ^ «Cg Toolkit | Разработчик NVIDIA» . 8 марта 2011 г.
- ^ «Примечания к выпуску Cg 2.0» (PDF) . nvidia.com . Январь 2008 года.
- ^ Перейти обратно: а б Марк Дж. Килгард , художник на двух страницах , 2003.
- ^ Перейти обратно: а б «Документация профиля Cg» . Разработчик Нвидиа .
- ^ «Модели шейдеров и профили шейдеров — приложения Win32» . docs.microsoft.com . 30 июня 2021 г.
- ^ Перейти обратно: а б с д и ж «Различия пиксельных шейдеров» . msdn.microsoft.com . 08.02.2011.
- ^ Перейти обратно: а б с д и Пипер, Крейг (15 марта 2004 г.). «Язык шейдеров высокого уровня Microsoft DirectX (HLSL)» (PPT) . microsoft.com . стр. 5–8, 24–25.
- ^ Шимпи, Ананд Лал. «NVIDIA представляет GeForce FX (NV30)» .
- ^ Уилсон, Дерек. «ATI Radeon X800 Pro и XT Platinum Edition: появление R420» .
- ^ Перейти обратно: а б Модель шейдеров 3.0, Ашу Реге, NVIDIA Developer Technology Group, 2004 г.
- ^ Перейти обратно: а б Система Direct3D 10, Дэвид Блайт, Microsoft Corporation, 2006 г.
- ^ «Регистры — ps_4_1 (Windows)» . msdn.microsoft.com . 23 августа 2019 г.
- ^ Перейти обратно: а б «Регистры — ps_5_0 (Windows)» . msdn.microsoft.com . 23 августа 2019 г.
- ^ Перейти обратно: а б с д «Различия вершинных шейдеров» . msdn.microsoft.com . 08.02.2011.
- ^ Перейти обратно: а б Шимпи, Ананд Лал. «NVIDIA представляет GeForce FX (NV30)» .
- ^ «Регистры — vs_4_1 (Windows)» . msdn.microsoft.com . 23 августа 2019 г.
- ^ «Портирование с FXC на DXC» . Гитхаб .
- ^ «microsoft/DirectXShaderCompiler: в этом репозитории размещен исходный код компилятора шейдеров DirectX, основанного на LLVM/Clang» . Майкрософт. 21 октября 2020 г.
- ^ «glslang: эталонный интерфейс Khronos для GLSL/ESSL, частичный интерфейс для HLSL и генератор SPIR-V» . Группа «Хронос». 21 октября 2020 г.
- ^ Мэтт Тернер. Видео на YouTube .
- ^ Стенсон, Ричард; Эй, Крис. «Язык шейдеров PlayStation для PS4» . КРИ Европа 2013 .
- ^ «Язык шейдеров ReShade FX» . Гитхаб . 15 февраля 2022 г.
- ^ «Плагин Maya Cg | NVIDIA» .
- ^ «Обзор возможностей LightWave 11.6» .
- ^ «Unity — Руководство: Написание шейдеров» .
Дальнейшее чтение
[ редактировать ]- Рандима Фернандо , Марк Дж. Килгард , Учебное пособие по компьютерной графике : Полное руководство по программируемой графике реального времени , Addison-Wesley Professional, ISBN 0-321-19496-9
- Рандима Фернандо , «GPU Gems: методы, советы и рекомендации по программированию для графики реального времени» , Addison-Wesley Professional, ISBN 0-321-22832-4
- Уильям Р. Марк, Р. Стивен Глэнвилл, Курт Экли , Марк Дж. Килгард , Cg: Система для программирования графического оборудования на C-подобном языке , Труды SIGGRAPH 2003, дои : 10.1145/1201775.882362
Внешние ссылки
[ редактировать ]- cgc-opensrc — зеркало для компилятора с открытым исходным кодом nvidia, 2002 г.
- Некоторые важные материалы (например, проектная документация) собраны в этих конспектах курса от Siggraph 2005.
- Материалы, размещенные на NVIDIA:
- Учебное пособие по вершинному шейдеру NeHe Cg
- Документация по стандарту Cg Shader, используемому эмуляторами.
- Арас Пранцявичюс, «Кроссплатформенные шейдеры» в 2014 году .