
- •Содержание
- •Очистка буферов графического устройства
- •Избирательная очистка буферов
- •Устранение скрытых дефектов приложения
- •Общие сведения о примитивах
- •Введение в hlsl
- •Типы данных hlsl
- •Функции и семантики hlsl
- •Техники, проходы и профили hlsl
- •IncludeHandler – объект, используемый для обработки директив #include в fx-файле. Так как наш файл не содержит директив #include, мы будем использовать значение null
- •Визуализация объекта, использующего эффект
- •Запускающее приложение
Типы данных hlsl
В HLSL все встроенные типы делятся на две большие группы: скалярные и векторные. Скалярные типы данных являются аналогами встроенных типов данных языка C.
Тип |
Описание |
bool |
Логический тип, который может принимать значения true или false |
int |
32-х битное целое число |
half |
16-ти битное число с плавающей точкой |
float |
32-х битное число с плавающей точкой |
double |
64-х битное число с плавающей точкой |
Задавая тип скаларной переменной, мы просто указываем компилятору свое пожелание. Если текущий ускоритель не поддерживает некоторые типы данных, используемые в программе, то при компиляции шейдера в машинный код они будут заменены ближайшими аналогами. Например, тип doubleможет быть заменен на тип float, half или какой-нибудь иной внутренний тип. Поэтому программист должен стараться избегать жесткой привязки к точности и допустимому диапазону значений используемого типа данных. Особенно это актуально для типа int, так как подавляющее большинство современных ускорителей не поддерживают тип int, в результате чего он эмулируется посредством одного из вещественных типов. Подобная эмуляция приводит к существенному падению производительности шейдера.
Большинство данных, используемых в трехмерной графике, является векторами размерности от 2 до 4 скаларных переменных. Так, координаты точки в трехмерном пространстве задаются трехмерным вектором, цвет пиксела - четырехмерным вектором (три цвета и альфа-канал). Соответственно, все современные GPU являются векторными процессорами, способными одновременно выполнять одну операцию сразу над набором из четырех чисел (четырехмерным вектором).
Для описание векторных данных в HLSL имеются векторные типы размерностью от 2 до 4. Если сказать обобщенно, то векторный тип из N элементов скалярного типа type задается с использованием синтаксиса, отдаленно напоминающего шаблоны из C#:
vector<type, size>
type - имя скалярного типа: bool, int, half, float или double
size - размерность вектора: 1, 2, 3 или 4
Например, объявление переменной v, являющейся вектором из четырех чисел типа float, выполняется так:
vector<float, 4> v;
Но на практике обычно используется сокращенная запись
float4 v;
Язык HLSL позволяет инициализировать вектор двумя способами. Первый способ - перечислить значения вектора в фигурных скобках, например, присвоение четырехмерному вектору v начального значения выглядит так
float4 v = {0.2, 0.4, 0.6, 0.8};
Другой способ - создать новый вектор с использованием конструктора и присвоить его вектору v:
float4 v = float4(0.2, 0.4, 0.6, 0.8);
Любой вектор имеет множество конструкторов, которые могут принимать в качестве параметров как переменные скалярных типов, так и - векторных. Единственное ограничение: общее количество всех компонентов векторных и скалярных типов должно быть равно N. Подобное многообразие конструкторов дает программисту большую гибкость при инициализации векторов. Например, вот как последовательно можно создать векторы разных размерностей:
float2 a = {0.1, 0.2}; // Создаем двухмерный вектор
float2 b = float2(0.3, 0.4); // Создаем еще один двухмерный
float3 c = float3(b, 1.0); // Создаем трехмерный вектор
float4 d = float4(0.7, c); // Создаем четырехмерный вектор
float4 e = float4(a, b); // Создаем еще один четырехмерный вектор