Cg (язык программирования) - Википедия - Cg (programming language)
Сцена, содержащая несколько различных 2D-шейдеров HLSL. Искажение статуи достигается чисто физически, в то время как текстура прямоугольной рамки рядом с ней основана на интенсивности цвета. Квадрат на заднем плане был преобразованный и повернутый. Частичный прозрачность и отражение воды на переднем плане добавляются шейдером, который в конечном итоге применяется ко всей сцене. | |
Семья | язык затенения |
---|---|
Разработчик | nVIDIA, Microsoft |
Интернет сайт | разработчик |
Диалекты | |
Cg, HLSL, язык шейдинга Playstation | |
Под влиянием | |
C, Язык затенения RenderMan | |
Под влиянием | |
GLSL |
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) вычислить шейдеры (ГПГПУ ) и тесселяционные шейдеры (корпус и домен). Последний присутствует в Cg 3.1.
- Представлен DirectX 12 (Shader Model 6.3) трассировка лучей шейдеры (генерация лучей, пересечение, бит / ближайшее попадание / промах).
Фон
Из-за технического прогресса в графическом оборудовании некоторые области программирования 3D-графики стали довольно сложными. Чтобы упростить процесс, в видеокарты были добавлены новые функции, в том числе возможность изменять конвейеры рендеринга с помощью вершинных и пиксельных шейдеров.
Вначале вершинные и пиксельные шейдеры программировались на очень низком уровне с использованием только языка ассемблера графического процессора. Хотя использование языка ассемблера давало программисту полный контроль над кодом и гибкость, его было довольно сложно использовать. Требовался переносимый язык более высокого уровня для программирования графического процессора, поэтому Cg был создан для решения этих проблем и облегчения разработки шейдеров.
Некоторые из преимуществ использования Cg перед сборкой:
- Код высокого уровня легче изучать, программировать, читать и поддерживать, чем код сборки.
- Cg-код переносится на широкий спектр оборудования и платформ, в отличие от ассемблерного кода, который обычно зависит от оборудования и платформ, для которых он написан.
- Компилятор Cg может оптимизировать код и автоматически выполнять задачи более низкого уровня, что сложно сделать и подвержено ошибкам при сборке.
Язык
Типы данных
Cg имеет шесть основных типов данных. Некоторые из них такие же, как в C, а другие специально добавлены для программирования на GPU. Вот эти типы:
- плавать - 32-битное число с плавающей запятой
- половина - 16-битное число с плавающей запятой
- int - 32-битное целое число
- фиксированный - 12-битное число с фиксированной точкой
- bool - логическая переменная
- sampler * - представляет объект текстуры
Cg также поддерживает векторные и матричные типы данных, основанные на базовых типах данных, таких как float3 и float4x4. Такие типы данных довольно часто встречаются при программировании трехмерной графики. Cg также имеет структуру и типы данных массива, которые работают аналогично их эквивалентам в C.
Операторы
Cg поддерживает широкий спектр операторов, включая общие арифметические операторы из C, эквивалентные арифметические операторы для векторных и матричных типов данных, а также общие логические операторы.
Функции и управляющие структуры
Cg разделяет основные управляющие структуры с C, например if / else, while и for. Он также имеет аналогичный способ определения функций.
Семантика
Препроцессор
Cg реализует множество Препроцессор C директивы и его система расширения макросов. Он реализует #включают
.[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.0a[10][11][12] | 2,0b[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 Буйство, 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 — Radeon 8500-9250, Матрокс Пархелия, DirectX 8.1.
- Шейдерная модель 2.0 — Radeon 9500-9800 / X300-X600, DirectX 9.
- Шейдерная модель 2.0a — GeForce FX / PCX -оптимизированная модель, DirectX 9.0a.
- Шейдерная модель 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 арифметические команды».
Версия вершинного шейдера | VS 1.1[18] | VS 2.0[11][18][19] | VS 2.0a[11][18][19] | VS 3.0[14][18] | VS 4.0[15] VS 4.1[20] VS 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 имеет набор функций для общих задач программирования на GPU. Некоторые функции имеют эквиваленты в C, например математические функции abs и sin, в то время как другие специализируются на задачах программирования на GPU, например наложение текстуры функции tex1D и tex2D.
Библиотека времени выполнения Cg
Cg-программы - это просто вершинные и пиксельные шейдеры, и им нужны вспомогательные программы, которые обрабатывают остальную часть процесса визуализации. Cg можно использовать с двумя графиками API: OpenGL или же DirectX. Каждый имеет свой собственный набор функций Cg для связи с программой Cg, таких как установка текущего шейдера Cg, передача параметров и другие задачи.
Помимо возможности компилировать исходный код Cg в код сборки, среда выполнения Cg также имеет возможность компилировать шейдеры во время выполнения вспомогательной программы. Это позволяет среде выполнения компилировать шейдер с использованием последних оптимизаций, доступных для оборудования, на котором в настоящее время выполняется программа. Однако этот метод требует, чтобы исходный код шейдера был доступен компилятору в виде обычного текста, что позволяет пользователю программы получить доступ к исходному коду шейдера. Некоторые разработчики считают это серьезным недостатком этой техники.
Чтобы избежать раскрытия исходного кода шейдера и при этом сохранить некоторые аппаратные оптимизации, была разработана концепция профилей. Шейдеры могут быть скомпилированы для различных графических аппаратных платформ (в соответствии с профилями). При выполнении вспомогательной программы загружается лучший / наиболее оптимизированный шейдер в соответствии с его профилем. Например, может быть профиль для видеокарты, поддерживающей сложные пиксельные шейдеры, и другой профиль для той, которая поддерживает только минимальные пиксельные шейдеры. Создавая пиксельный шейдер для каждого из этих профилей, поддерживающая программа увеличивает количество поддерживаемых аппаратных платформ без ущерба для качества изображения на мощных системах ».
Составители и диалекты
У диалекта Cg когда-либо был только один компилятор в виде набора инструментов Nvidia Cg.
Microsoft выпустила два компилятора для HLSL. Первоначальный компилятор был FXC с закрытым исходным кодом (компилятор эффектов), поддерживавшийся до 2015 года. Он был объявлен устаревшим в пользу открытого исходного кода. LLVM на основе DXC (DirectXShaderCompiler) с поддержкой новых функций HLSL.[21] Оба компилятора генерируют байт-код: в то время как старый FXC использовал DXBC, DXC теперь использует DXIL. DXC также может излучать СПИР-В байт-код.[22]
В Хронос Групп также написал компилятор 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
// входная вершинаструктура VertIn { float4 позиция : ПОЗИЦИЯ; float4 цвет : ЦВЕТ0;};// вывод вершиныструктура VertOut { float4 позиция : ПОЗИЦИЯ; float4 цвет : ЦВЕТ0;};// основная запись вершинного шейдераVertOut главный(VertIn В, униформа float4x4 modelViewProj) { VertOut ИЗ; ИЗ.позиция = мул(modelViewProj, В.позиция); // вычисляем выходные координаты ИЗ.цвет = В.цвет; // копируем цвет ввода в вывод ИЗ.цвет.z = 1.0ж; // синий компонент цвета = 1.0f возвращаться ИЗ;}
Приложения и игры, использующие Cg или HLSL
- 3DVIA Virtools
- Adobe Photoshop
- майя[27]
- Battlefield 2
- Cafu Engine
- Кристальное пространство
- Гонщик дельфинов
- Спецназ Земли - Мод Half-Life
- Вражеская территория: Quake Wars
- Doom 3 BFG издание
- EON Professional ™ / Ultra ™ из EON Reality
- Eyeon Fusion
- Большая разница
- Гаршасп: Убийца монстров
- GLScene
- Gun Metal
- Hitman: Blood Money
- Irrlicht Engine
- Лига Легенд
- Lightfeather 3D Engine
- Световая волна 11.6[28]
- muvee Reveal
- ОГРЭ
- OpenEmu
- Panda3D
- PCSX2
- PlayStation 3
- RetroArch
- R.U.S.E.
- Snes9x
- Игровой движок Unity[29]
- Unreal Engine
Смотрите также
- Компьютерное программирование
- Компьютерная графика
- Вершинные и пиксельные шейдеры
- Язык шейдеров высокого уровня
- Язык затенения OpenGL
- Шейдерная модель
- OpenGL
- DirectX
Рекомендации
- ^ "Fusion Industries :: Cg и HLSL FAQ ::". 24 августа 2012 г. Архивировано с оригинал 24 августа 2012 г.
- ^ "Учебник по компьютерной графике - Глава 1. Введение". developer.download.nvidia.cn.
- ^ «Написание HLSL шейдеров в Direct3D 9 (Windows)». msdn.microsoft.com.
- ^ "Cg FAQ". NVIDIA DesignWorks. 8 марта 2011 г.. Получено 25 мая 2017.
- ^ "Cg Toolkit | Разработчик NVIDIA". 8 марта 2011 г.
- ^ https://developer.download.nvidia.com/cg/Cg_2.0/2.0.0012/Cg-2.0_Jan2008_ReleaseNotes.pdf
- ^ а б Марк Дж. Килгард, Cg на двух страницах, 2003.
- ^ а б "Документация по профилю Cg". Разработчик Nvidia.
- ^ «Шейдерные модели и шейдерные профили - приложения Win32». docs.microsoft.com.
- ^ а б c d е ж «Различия в пиксельных шейдерах». msdn.microsoft.com. 2011-02-08.
- ^ а б c d е Пипер, Крэйг (2004-03-15). «Язык шейдеров высокого уровня Microsoft DirectX (HLSL)» (PPT). microsoft.com. С. 5–8, 24–25.
- ^ Шимпи, Ананд Лал. «NVIDIA представляет GeForce FX (NV30)».
- ^ Уилсон, Дерек. «ATI Radeon X800 Pro и XT Platinum Edition: прибытие R420».
- ^ а б Shader Model 3.0, Ашу Реге, NVIDIA Developer Technology Group, 2004.
- ^ а б Система Direct3D 10, Дэвид Блайт, Microsoft Corporation, 2006.
- ^ "Регистры - ps_4_1 (Windows)". msdn.microsoft.com.
- ^ а б "Регистры - ps_5_0 (Windows)". msdn.microsoft.com.
- ^ а б c d «Различия вершинных шейдеров». msdn.microsoft.com. 2011-02-08.
- ^ а б Шимпи, Ананд Лал. «NVIDIA представляет GeForce FX (NV30)».
- ^ «Регистры - vs_4_1 (Windows)». msdn.microsoft.com.
- ^ «Переход с FXC на DXC». GitHub.
- ^ "microsoft / DirectXShaderCompiler: в этом репозитории размещен исходный код для DirectX Shader Compiler, основанного на LLVM / Clang". Microsoft. 21 октября 2020.
- ^ "glslang: интерфейс Khronos-reference для GLSL / ESSL, частичный интерфейс для HLSL и генератор SPIR-V". Группа Хронос. 21 октября 2020.
- ^ Мэтт Тернер. видео на YouTube.
- ^ Стенсон, Ричард; Хо, Крис. «Язык затенения PlayStation для PS4». GDC Europe 2013.
- ^ «Язык затенения ReShade FX». GitHub.
- ^ "Подключаемый модуль Maya Cg | NVIDIA".
- ^ "LightWave - 11.6 Обзор возможностей".
- ^ «Unity - Руководство: написание шейдеров».
дальнейшее чтение
- Рандима Фернандо, Марк Дж. Килгард, Учебник Cg: Полное руководство по программируемой графике в реальном времени, Эддисон-Уэсли Профессионал, ISBN 0-321-19496-9
- Рандима Фернандо, Gems GPU: методы программирования, советы и хитрости для графики в реальном времени, Эддисон-Уэсли Профессионал, ISBN 0-321-22832-4
- Уильям Р. Марк, Р. Стивен Гланвилл, Курт Экли, Марк Дж. Килгард, Cg: система программирования графического оборудования на языке C-подобном, Труды СИГГРАФ 2003, Дои:10.1145/1201775.882362
внешняя ссылка
- cgc-opensrc - Зеркало для компилятора с открытым исходным кодом nvidia, 2002 г.
- Некоторые важные материалы (например, дизайнерская бумага) собраны в эти заметки из курса Siggraph 2005
- Материалы, размещенные на Nvidia:
- Руководство по вершинному шейдеру NeHe Cg
- Документация по стандарту Cg Shader, используемому эмуляторами
- Арас Пранцкявичюс, Кросс-платформенные шейдеры в 2014 году.