Interested Article - Cg

Cg (сокращение от C for Graphics ) — высокоуровневый язык программирования , разработанный Nvidia в тесном сотрудничестве с Microsoft для программирования шейдеров . Cg основан на языке программирования C . Несмотря на то, что они имеют один и тот же синтаксис , некоторые функции C были изменены и добавлены новые типы данных, чтобы сделать Cg более подходящим для программирования графических процессоров . Этот язык специализирован для программирования графического процессора и не используется для GPGPU . Компилятор Cg выводит программы шейдеров DirectX или OpenGL . С 2012 года Cg устарела, без дополнительной поддержки.

Общие сведения

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

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

Некоторые из преимуществ Cg:

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

Подробности

Типы данных

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

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

Cg также содержит векторные и матричные типы данных, основанные на базовых типах данных, такие как float3 и float4x4 . Такие типы данных довольно распространены при работе с 3D программированием. Cg также имеет типы данных структуры и массива, которые работают аналогично их C-эквивалентам.

Операторы

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

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

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

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

Как и в C, Cg имеет набор функций для общих задач программирования графического процессора. Некоторые из функций имеют эквиваленты в C, как математические функции abs и sin , в то время как другие специализируются на задачах графического программирования, такие как функции отображения текстуры tex1D и tex2D .

Библиотека времени выполнения Cg

Программы Cg — это только шейдеры, и им нужны поддерживающие программы, которые обрабатывают остальную часть процесса рендеринга. Cg можно использовать с двумя графическими API : OpenGL или DirectX . Каждый из них имеет свой собственный набор функций для связи с программой Cg, например, с установкой текущего шейдера Cg, передачей параметров и т. п.

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

Чтобы избежать раскрытия исходного кода шейдера и по-прежнему поддерживать некоторые из конкретных аппаратных оптимизаций, была разработана концепция профилей. Шейдеры могут быть скомпилированы в соответствии с различными графическими аппаратными платформами (в соответствии с профилями). При выполнении поддерживающей программы наиболее оптимизированный шейдер загружается в соответствии с его профилем. Например, может быть профиль для видеокарты , поддерживающей сложные шейдеры, и другой профиль, который поддерживает только минимальные шейдеры. Создавая шейдер для каждого из этих профилей, поддерживающая программа увеличивает количество поддерживаемых платформ, не жертвуя качеством изображения на мощных системах.

Пример шейдера Cg

 // input vertex
 struct VertIn {
     float4 pos   : POSITION;
     float4 color : COLOR0;
 };
 
 // output vertex
 struct VertOut {
     float4 pos   : POSITION;
     float4 color : COLOR0;
 };
 
 // vertex shader main entry
 VertOut main(VertIn IN, uniform float4x4 modelViewProj) {
     VertOut OUT;
     OUT.pos     = mul(modelViewProj, IN.pos); // calculate output coords
     OUT.color   = IN.color; // copy input color to output
     OUT.color.z = 1.0f; // blue component of color = 1.0f
     return OUT;
 }

Примечания

  1. . Дата обращения: 7 сентября 2018. 7 сентября 2018 года.
  2. . Дата обращения: 7 сентября 2018. 7 сентября 2018 года.
Источник —

Same as Cg