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

редактировать
Язык шейдинга
Cg / HLSL
HLSL-Примеры-1.PNG Сцена, содержащая несколько различных шейдеров 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 изначально включал поддержку только для вершинных шейдеров и пиксельных шейдеров, но постепенно вводились и другие типы шейдеров:

Содержание
  • 1 Предпосылки
  • 2 Язык
    • 2.1 Типы данных
    • 2.2 Операторы
    • 2.3 Функции и управляющие структуры
    • 2.4 Семантика
    • 2.5 Препроцессор
    • 2.6 Функции HLSL
  • 3 Среда
    • 3.1 Цели компиляции
    • 3.2 Стандартная библиотека
    • 3.3 Библиотека времени выполнения Cg
  • 4 Компиляторы и диалекты
    • 4.1 Производные языки
  • 5 Примеры
    • 5.1 Пример вершинного шейдера Cg
  • 6 Приложения и игры, использующие Cg или HLSL
  • 7 См. Также
  • 8 Ссылки
  • 9 Дополнительная литература
  • 10 Внешние ссылки
Предпосылки

Благодаря техническим достижениям в графическом оборудовании, некоторые области программирования 3D-графики стали довольно сложными. Чтобы упростить процесс, в видеокарты были добавлены новые функции, в том числе возможность изменять конвейеры рендеринга с помощью вершинных и пиксельных шейдеров.

Вначале вершинные и пиксельные шейдеры были запрограммированы на очень низком уровне с использованием только языка ассемблера графического процессора. Хотя использование ассемблера давало программисту полный контроль над кодом и гибкость, пользоваться им было довольно сложно. Требовался переносимый язык более высокого уровня для программирования графического процессора, поэтому Cg был создан для решения этих проблем и облегчения разработки шейдеров.

Некоторые из преимуществ использования Cg перед сборкой:

  • Код высокого уровня легче изучать, программировать, читать и поддерживать, чем код сборки.
  • Код Cg переносим на широкий спектр оборудования и платформ, в отличие от ассемблерного кода, который обычно зависит от оборудования и платформ, для которых он написан.
  • Компилятор Cg может оптимизировать код и автоматически выполнять задачи более низкого уровня, что сложно сделать и подвержено ошибкам в ассемблере.
Язык

Типы данных

Cg имеет шесть основных типов данных. Некоторые из них такие же, как в C, а другие специально добавлены для программирования на GPU. Эти типы:

  • float - 32-битное число с плавающей запятой
  • half - 16-битное число с плавающей запятой
  • int - 32-битное целое число
  • fixed - a 12-битное число с фиксированной запятой
  • bool - логическая переменная
  • sampler * - представляет объект текстуры

Cg также имеет векторные и матричные типы данных, которые основаны на базовых типах данных, таких как float3 и float4x4. Такие типы данных довольно часто встречаются при программировании трехмерной графики. Cg также имеет типы данных struct и , которые работают аналогично их эквивалентам в C.

Операторы

Cg поддерживает широкий спектр операторов, включая обычные арифметические операторы из C, эквивалентные арифметические операторы для векторных и матричных типов данных и общие логические операторы.

Функции и управляющие структуры

Cg разделяет базовые управляющие структуры с C, например if / else, while и for. Он также имеет аналогичный способ определения функций.

Семантика

Препроцессор

Cg реализует множество директив препроцессора C и его систему расширения макросов. Он реализует #include.

функции HLSL

  • Namespace
  • Annotation
Environment

Цели компиляции

Программы Cg созданы для различных профилей шейдеров, которые подставка для графических процессоров с разными возможностями. Эти профили определяют, среди прочего, сколько инструкций может быть в каждом шейдере, сколько регистров доступно и какие ресурсы шейдер может использовать. Даже если программа верна, она может быть слишком сложной для работы с профилем.

Поскольку количество типов профилей и шейдеров резко увеличилось, Microsoft перешла на использование термина «шейдерная модель» для группировки набора профилей, найденных в поколении графических процессоров. Cg поддерживает некоторые из новых профилей до Shader Model 5.0, а также перевод в glsl или hlsl.

Сравнение пиксельных шейдеров HLSL
Версия пиксельных шейдеров1.0 до 1.31,42,02,0a2,0b3,04,0. 4,1. 5,0
зависимый лимит текстуры468Без ограничений8Без ограниченийБез ограничений
Лимит инструкций текстуры46*232Без ограниченийБез ограниченийБез ограниченийБез ограничений
Регистр положенияNoNoNoNoNoДаДа
Слоты команд8+48+432 + 64512512≥ 512≥ 65536
Выполненные инструкции8 + 46 * 2 + 8 * 232 + 6451251265536Без ограничений
Текстура косвенные адреса444Без ограничений4Без ограниченийБез ограничений
Интерполированные регистры2 + 42 + 62 + 82 + 82 + 81032
Предикация инструкцииNoNoNoДаNoДаНет
Регистр ввода индекса rsNoNoNoNoNoДаДа
Временные регистры26от 12 до 322232324096
Постоянные регистры8832323222416 × 4096
Произвольно Swizzling NoNoNoДаNoДаДа
Инструкции по градиентуNoNoNoДаNoДаДа
Регистр счетчика цикловNoNoNoNoNoДаДа
Регистр лиц (двустороннее освещение)NoNoNoNoДаДаДа
Динамическое управление потокомNoNoNoNoNoДа (24)Да (64)
Побитовые операторыNoNoNoNoNoNoДа
Нативные целые числаNoNoNoNoNoNoДа

«32 + 64» для исполняемых инструкций означает «32 текстурные инструкции и 64 арифметики. c инструкции ".

Сравнение вершинных шейдеров HLSL
Версия вершинного шейдераVS 1.1VS 2.0VS 2.0aVS 3.0VS 4.0. VS 4.1. VS 5.0
Количество слотов инструкций128256256≥ 512≥ 65536
Максимальное количество выполненных инструкций12810246553665536Без ограничений
Предикация инструкций NoNoДаДаДа
Временные регистры121216324096
# постоянных регистров≥ 96≥ 256256≥ 25616 × 4096
Статическое управление потокомNoДаДаДаДа
Динамическое управление потокомNoNoДаДаДа
Глубина динамического управления потокомН / AН / Д242464
Выборка текстуры вершиныNoNoNoДаДа
Количество сэмплеров текстурыН / ДН / ДН / Д4128
Поддержка экземпляра геометрии NoNoNoДаДа
Побитовые операторыNoNoNoNoДа
Собственные целые числаNoNoNoNoДа

Библиотека ndard

Как и в 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 года. Он был объявлен устаревшим в пользу 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 и вводятся в игры в качестве фильтров постобработки.

Примеры

Пример вершинного шейдера Cg

// входная вершина 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; }
Приложения и игры, использующие Cg или HLSL
См. Также
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-14 04:06:29
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте