Cg (язык программирования) - Cg (programming language)

Cg / HLSL
HLSL-Примеры-1.PNG
Сцена, содержащая несколько различных 2D-шейдеров HLSL. Искажение статуи достигается чисто физически, в то время как текстура прямоугольной рамки рядом с ней основана на интенсивности цвета. Квадрат на заднем плане был преобразованный и повернутый. Частичный прозрачность и отражение воды на переднем плане добавляются шейдером, который в конечном итоге применяется ко всей сцене.
Семьяязык затенения
РазработчикnVIDIA, Microsoft
Интернет сайтразработчик.nvidia.com/ cg-toolkit
Диалекты
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 изначально включал поддержку только для вершинные шейдеры и пиксельные шейдеры, но постепенно вводились и другие типы шейдеров:

Фон

Из-за технического прогресса в графическом оборудовании некоторые области программирования 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]

Сравнение пиксельных шейдеров HLSL
Версия пиксельного шейдераОт 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]
Ограничение зависимых текстур468Безлимитный8БезлимитныйБезлимитный
Предел инструкции текстуры46*232БезлимитныйБезлимитныйБезлимитныйБезлимитный
Регистр позицийНетНетНетНетНетдада
Слоты для инструкций8+48+432 + 64512512≥ 512≥ 65536
Выполненные инструкции8+46*2+8*232 + 6451251265536Безлимитный
Указания на текстуры444Безлимитный4БезлимитныйБезлимитный
Интерполированные регистры2 + 42 + 62 + 82 + 82 + 81032
Предикация инструкцииНетНетНетдаНетдаНет
Регистры ввода индексаНетНетНетНетНетдада
Регистры температуры26От 12 до 322232324096
Постоянные регистры8832323222416×4096
Произвольный пьянящийНетНетНетдаНетдада
Инструкции по градиентуНетНетНетдаНетдада
Регистр счетчика цикловНетНетНетНетНетдада
Регистр лиц (двусторонняя подсветка)НетНетНетНетдадада
Динамическое управление потокомНетНетНетНетНетЕсть (24)Есть (64)
Побитовые операторыНетНетНетНетНетНетда
Родные целые числаНетНетНетНетНетНетда
  • PS 1.0 - неизданный 3dfx Буйство, DirectX 8.
  • PS 1.1GeForce 3, DirectX 8.
  • PS 1.23Dlabs Wildcat VP, DirectX 8.0a.
  • PS 1.3GeForce 4 Ti, DirectX 8.0a.
  • PS 1.4Radeon 8500-9250, Матрокс Пархелия, DirectX 8.1.
  • Шейдерная модель 2.0Radeon 9500-9800 / X300-X600, DirectX 9.
  • Шейдерная модель 2.0aGeForce FX / PCX -оптимизированная модель, DirectX 9.0a.
  • Шейдерная модель 2.0bRadeon X700-X850 шейдерная модель, DirectX 9.0b.
  • Шейдерная модель 3.0Radeon X1000 и GeForce 6, DirectX 9.0c.
  • Шейдерная модель 4.0Radeon HD 2000 и GeForce 8, DirectX 10.
  • Шейдерная модель 4.1Radeon HD 3000 и GeForce 200, DirectX 10.1.
  • Шейдерная модель 5.0Radeon HD 5000 и GeForce 400, DirectX 11.
  • Шейдерная модель 5.1GCN 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 арифметические команды».

Сравнение вершинных шейдеров HLSL
Версия вершинного шейдера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]
# слотов инструкций128256256≥ 512≥ 65536
Максимальное количество выполненных инструкций12810246553665536Безлимитный
Предикация инструкцииНетНетдадада
Регистры температуры121216324096
# постоянных регистров≥ 96≥ 256256≥ 25616×4096
Статический контроль потокаНетдададада
Динамическое управление потокомНетНетдадада
Глубина динамического контроля потокаНет данныхНет данных242464
Получение текстуры вершинНетНетНетдада
Кол-во сэмплеров текстурНет данныхНет данныхНет данных4128
Создание экземпляра геометрии поддерживатьНетНетНетдада
Побитовые операторыНетНетНетНетда
Родные целые числаНетНетНетНетда

Стандартная библиотека

Как и в 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

Смотрите также

Рекомендации

  1. ^ "Fusion Industries :: Cg и HLSL FAQ ::". 24 августа 2012 г. Архивировано с оригинал 24 августа 2012 г.
  2. ^ "Учебник по компьютерной графике - Глава 1. Введение". developer.download.nvidia.cn.
  3. ^ «Написание HLSL шейдеров в Direct3D 9 (Windows)». msdn.microsoft.com.
  4. ^ "Cg FAQ". NVIDIA DesignWorks. 8 марта 2011 г.. Получено 25 мая 2017.
  5. ^ "Cg Toolkit | Разработчик NVIDIA". 8 марта 2011 г.
  6. ^ https://developer.download.nvidia.com/cg/Cg_2.0/2.0.0012/Cg-2.0_Jan2008_ReleaseNotes.pdf
  7. ^ а б Марк Дж. Килгард, Cg на двух страницах, 2003.
  8. ^ а б "Документация по профилю Cg". Разработчик Nvidia.
  9. ^ «Шейдерные модели и шейдерные профили - приложения Win32». docs.microsoft.com.
  10. ^ а б c d е ж «Различия в пиксельных шейдерах». msdn.microsoft.com. 2011-02-08.
  11. ^ а б c d е Пипер, Крэйг (2004-03-15). «Язык шейдеров высокого уровня Microsoft DirectX (HLSL)» (PPT). microsoft.com. С. 5–8, 24–25.
  12. ^ Шимпи, Ананд Лал. «NVIDIA представляет GeForce FX (NV30)».
  13. ^ Уилсон, Дерек. «ATI Radeon X800 Pro и XT Platinum Edition: прибытие R420».
  14. ^ а б Shader Model 3.0, Ашу Реге, NVIDIA Developer Technology Group, 2004.
  15. ^ а б Система Direct3D 10, Дэвид Блайт, Microsoft Corporation, 2006.
  16. ^ "Регистры - ps_4_1 (Windows)". msdn.microsoft.com.
  17. ^ а б "Регистры - ps_5_0 (Windows)". msdn.microsoft.com.
  18. ^ а б c d «Различия вершинных шейдеров». msdn.microsoft.com. 2011-02-08.
  19. ^ а б Шимпи, Ананд Лал. «NVIDIA представляет GeForce FX (NV30)».
  20. ^ «Регистры - vs_4_1 (Windows)». msdn.microsoft.com.
  21. ^ «Переход с FXC на DXC». GitHub.
  22. ^ "microsoft / DirectXShaderCompiler: в этом репозитории размещен исходный код для DirectX Shader Compiler, основанного на LLVM / Clang". Microsoft. 21 октября 2020.
  23. ^ "glslang: интерфейс Khronos-reference для GLSL / ESSL, частичный интерфейс для HLSL и генератор SPIR-V". Группа Хронос. 21 октября 2020.
  24. ^ Мэтт Тернер. видео на YouTube.
  25. ^ Стенсон, Ричард; Хо, Крис. «Язык затенения PlayStation для PS4». GDC Europe 2013.
  26. ^ «Язык затенения ReShade FX». GitHub.
  27. ^ "Подключаемый модуль Maya Cg | NVIDIA".
  28. ^ "LightWave - 11.6 Обзор возможностей".
  29. ^ «Unity - Руководство: написание шейдеров».

дальнейшее чтение

внешняя ссылка