Сцена, содержащая несколько различных шейдеров 2D HLSL. Искажение статуи достигается чисто физически, в то время как текстура прямоугольной рамки рядом с ней основана на интенсивности цвета. Квадрат на заднем плане был преобразован и повернут. Частичная прозрачность и отражение воды на переднем плане добавляются шейдером, применяемым окончательно ко всей сцене. | |
Семейство | язык затенения |
---|---|
Разработчик | nVIDIA, Microsoft |
Веб-сайт | разработчик.nvidia.com / cg-toolkit |
Диалекты | |
Cg, HLSL, Playstation Shading Language | |
Испытано | |
C, | |
Influenced | |
GLSL |
Cg(сокращение от C для Graphics ) и High-Level Shading Language (HLSL ) - это два названия, данные высоким -уровень язык затенения, разработанный Nvidia и Microsoft для программирования шейдеров. Cg / HLSL основан на языке программирования C, и, хотя они используют один и тот же базовый синтаксис, были изменены некоторые функции C и добавлены новые типы данных, чтобы сделать Cg / HLSL более подходящим для программирования графики блоки обработки.
Существуют две основные ветви языка Cg / HLSL: компилятор Nvidia Cg (cgc), который выводит DirectX или OpenGL, и Microsoft HLSL, который выводит шейдеры DirectX в байт-коде. формат. Cg был устаревшим в 2012 году, без дополнительных разработок или поддержки.
HLSL-шейдеры могут обеспечить значительное увеличение скорости и детализации, а также множество специальных эффектов как в 2D и 3D компьютерная графика. Язык Cg / HLSL изначально включал поддержку только для вершинных шейдеров и пиксельных шейдеров, но постепенно вводились и другие типы шейдеров:
Благодаря техническим достижениям в графическом оборудовании, некоторые области программирования 3D-графики стали довольно сложными. Чтобы упростить процесс, в видеокарты были добавлены новые функции, в том числе возможность изменять конвейеры рендеринга с помощью вершинных и пиксельных шейдеров.
Вначале вершинные и пиксельные шейдеры были запрограммированы на очень низком уровне с использованием только языка ассемблера графического процессора. Хотя использование ассемблера давало программисту полный контроль над кодом и гибкость, пользоваться им было довольно сложно. Требовался переносимый язык более высокого уровня для программирования графического процессора, поэтому Cg был создан для решения этих проблем и облегчения разработки шейдеров.
Некоторые из преимуществ использования Cg перед сборкой:
Cg имеет шесть основных типов данных. Некоторые из них такие же, как в C, а другие специально добавлены для программирования на GPU. Эти типы:
Cg также имеет векторные и матричные типы данных, которые основаны на базовых типах данных, таких как float3 и float4x4. Такие типы данных довольно часто встречаются при программировании трехмерной графики. Cg также имеет типы данных struct и , которые работают аналогично их эквивалентам в C.
Cg поддерживает широкий спектр операторов, включая обычные арифметические операторы из C, эквивалентные арифметические операторы для векторных и матричных типов данных и общие логические операторы.
Cg разделяет базовые управляющие структуры с C, например if / else, while и for. Он также имеет аналогичный способ определения функций.
Cg реализует множество директив препроцессора C и его систему расширения макросов. Он реализует #include
.
Программы Cg созданы для различных профилей шейдеров, которые подставка для графических процессоров с разными возможностями. Эти профили определяют, среди прочего, сколько инструкций может быть в каждом шейдере, сколько регистров доступно и какие ресурсы шейдер может использовать. Даже если программа верна, она может быть слишком сложной для работы с профилем.
Поскольку количество типов профилей и шейдеров резко увеличилось, Microsoft перешла на использование термина «шейдерная модель» для группировки набора профилей, найденных в поколении графических процессоров. Cg поддерживает некоторые из новых профилей до Shader Model 5.0, а также перевод в glsl или hlsl.
Версия пиксельных шейдеров | 1.0 до 1.3 | 1,4 | 2,0 | 2,0a | 2,0b | 3,0 | 4,0. 4,1. 5,0 |
---|---|---|---|---|---|---|---|
зависимый лимит текстуры | 4 | 6 | 8 | Без ограничений | 8 | Без ограничений | Без ограничений |
Лимит инструкций текстуры | 4 | 6*2 | 32 | Без ограничений | Без ограничений | Без ограничений | Без ограничений |
Регистр положения | No | No | No | No | No | Да | Да |
Слоты команд | 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 |
Предикация инструкции | No | No | No | Да | No | Да | Нет |
Регистр ввода индекса rs | No | No | No | No | No | Да | Да |
Временные регистры | 2 | 6 | от 12 до 32 | 22 | 32 | 32 | 4096 |
Постоянные регистры | 8 | 8 | 32 | 32 | 32 | 224 | 16 × 4096 |
Произвольно Swizzling | No | No | No | Да | No | Да | Да |
Инструкции по градиенту | No | No | No | Да | No | Да | Да |
Регистр счетчика циклов | No | No | No | No | No | Да | Да |
Регистр лиц (двустороннее освещение) | No | No | No | No | Да | Да | Да |
Динамическое управление потоком | No | No | No | No | No | Да (24) | Да (64) |
Побитовые операторы | No | No | No | No | No | No | Да |
Нативные целые числа | No | No | No | No | No | No | Да |
«32 + 64» для исполняемых инструкций означает «32 текстурные инструкции и 64 арифметики. c инструкции ".
Версия вершинного шейдера | VS 1.1 | VS 2.0 | VS 2.0a | VS 3.0 | VS 4.0. VS 4.1. VS 5.0 |
---|---|---|---|---|---|
Количество слотов инструкций | 128 | 256 | 256 | ≥ 512 | ≥ 65536 |
Максимальное количество выполненных инструкций | 128 | 1024 | 65536 | 65536 | Без ограничений |
Предикация инструкций | No | No | Да | Да | Да |
Временные регистры | 12 | 12 | 16 | 32 | 4096 |
# постоянных регистров | ≥ 96 | ≥ 256 | 256 | ≥ 256 | 16 × 4096 |
Статическое управление потоком | No | Да | Да | Да | Да |
Динамическое управление потоком | No | No | Да | Да | Да |
Глубина динамического управления потоком | Н / A | Н / Д | 24 | 24 | 64 |
Выборка текстуры вершины | No | No | No | Да | Да |
Количество сэмплеров текстуры | Н / Д | Н / Д | Н / Д | 4 | 128 |
Поддержка экземпляра геометрии | No | No | No | Да | Да |
Побитовые операторы | No | No | No | No | Да |
Собственные целые числа | No | No | No | No | Да |
Как и в C, Cg / HLSL имеет набор функций для общих задач программирования на GPU. Некоторые функции имеют эквиваленты в C, например математические функции abs и sin, в то время как другие специализируются на задачах программирования на GPU, например, функции наложения текстур tex1D и tex2D.
Программы Cg - это просто вершинные и пиксельные шейдеры, и им нужны вспомогательные программы, которые обрабатывают остальную часть процесса рендеринга. Cg можно использовать с двумя графическими API : OpenGL или DirectX. Каждый имеет свой собственный набор функций Cg для связи с программой Cg, таких как установка текущего шейдера Cg, передача параметров и другие задачи.
Помимо возможности компилировать исходный код Cg в код сборки, среда выполнения Cg также может компилировать шейдеры во время выполнения вспомогательной программы. Это позволяет среде выполнения компилировать шейдер с использованием последних оптимизаций, доступных для оборудования, на котором в настоящее время выполняется программа. Однако этот метод требует, чтобы исходный код шейдера был доступен компилятору в виде простого текста, что позволяет пользователю программы получить доступ к исходному коду шейдера. Некоторые разработчики считают это серьезным недостатком этой техники.
Чтобы избежать раскрытия исходного кода шейдера и при этом сохранить некоторые аппаратные оптимизации, была разработана концепция профилей. Шейдеры могут быть скомпилированы для различных графических аппаратных платформ (в соответствии с профилями). При выполнении вспомогательной программы загружается лучший / наиболее оптимизированный шейдер в соответствии с его профилем. Например, может быть профиль для видеокарты, поддерживающей сложные пиксельные шейдеры, и другой профиль для той, которая поддерживает только минимальные пиксельные шейдеры. Создавая пиксельный шейдер для каждого из этих профилей, поддерживающая программа увеличивает количество поддерживаемых аппаратных платформ без ущерба для качества изображения на мощных системах ».
Диалект Cg когда-либо имел только один компилятор в виде набора инструментов Nvidia Cg.
Microsoft выпустила два компилятора для HLSL. Первоначальный компилятор представлял собой FXC (компилятор эффектов) с закрытым исходным кодом, поддерживавшийся до 2015 года. Он был объявлен устаревшим в пользу DXC с открытым исходным кодом LLVM (DirectXShaderCompiler) с поддержкой новых функций HLSL. Оба компилятора генерируют байт-код: в то время как старый FXC использовал DXBC, DXC теперь использует DXIL. DXC также может выдавать байт-код SPIR-V.
Khronos Group также написала компилятор HLSL на основе LLVM в виде интерфейса для glslang, их Компилятор GLSL-to-SPIR_V. Поддержка SPIR-V означает, что шейдеры могут быть кроссплатформенными, больше не ограничивая их стеком DirectX. Эта задача ранее выполнялась преобразователями уровня исходного кода, такими как HLSL2GLSL, но результирующий код часто раздувается.
Основаны на Cg / HLSL.
Язык шейдинга ReshadeFX также основан на Cg / HLSL. Шейдеры, написанные в ReshadeFX, компилируются в OpenGL, DX или Vulkan и вводятся в игры в качестве фильтров постобработки.
// входная вершина struct VertIn {float4 pos: POSITION; float4 цвет: COLOR0; }; // вывод структуры вершины VertOut {float4 pos: POSITION; float4 цвет: COLOR0; }; // основная запись вершинного шейдера VertOut main (VertIn IN, uniform float4x4 modelViewProj) {VertOut OUT; OUT.pos = mul (modelViewProj, IN.pos); // вычисляем выходные координаты OUT.color = IN.color; // копируем входной цвет в выходной OUT.color.z = 1.0f; // синий компонент цвета = 1.0f return OUT; }