Transcript Document

Разработка шейдеров
с HLSL
Guennadi Riguer
[email protected]
Обзор Материала
•
•
•
•
•
•
Типы данных
Операторы
Конструкторы
Управление исполнением шейдеров
Функции
Семантика деклараций
ATI Technologies Inc. – Январь 2003
High Level Shader Language
(HLSL)
•
•
HLSL в DirectX® 9 – язык шейдеров высокого
уровня от Microsoft
Преимущества языка HLSL
– Все стандартные преимущества языков высокого
уровня
Более быстрая и простая разраборка
• Повторное использование кода и библиотек функций
•
– Высокий уровень оптимизаций
– Стандарт индустрии с гарантированной
поддержкой всех видеокарт
ATI Technologies Inc. – Январь 2003
Типы Данных в HLSL
•
Скалярные типы данных
– bool – булевское значение
– int – 32-битовое целочисленное значение со
знаком
– half – 16-битовое число с плавающей точкой
– float – 32-битовое число с плавающей точкой
– double – 64-битовое число с плавающей точкой
•
Поддержка конкретных типов и их точность
не гарантированы и зависит от аппаратной
имплементации
float fVar;
const int iVar = 2;
ATI Technologies Inc. – Январь 2003
Типы Данных в HLSL
•
Векторные данные
– По умолчанию 4 компонента типа float
– Предопределены все типы векторов (bool3, int2,
float4, и т.д.)
vector vVar;
vector<float,4> vVar;
float4 vVar;
int2 vVar1;
•
Доступ к компонентам вектора
vVar.х
vVar[0]
ATI Technologies Inc. – Январь 2003
Типы Данных в HLSL
•
Матричные данные
– По умолчанию 4х4 элемента типа float
– Предопределены все типы матриц (bool3х1,
float4х4, и т.д.)
matrix mVar;
matrix<float,4,4> mVar;
float4x4 vVar;
int2x3 vVar1;
•
Можно контролировать ориентaцию
#pragma pack_matrix (row_major);
•
Доступ к элементам и строкам матрицы
mVar._m00, mVar._11, mVar[0][0]
mVar._m00_m01_m02_m03, mVar[0]
ATI Technologies Inc. – Январь 2003
Типы Данных в HLSL
•
Поддерживаются массивы
float2 offs2D[5];
•
Так же поддерживаются структуры
struct VERTEX
{
float3 Pos;
float3 Norm;
float2 TexCoord;
}
ATI Technologies Inc. – Январь 2003
Приведение Типов
•
Значения с плавающей точкой могут быть
пререведены в вектора повторением
vVec3+0.5  vVec3+float3(0.5,0.5,0.5)
•
Типы векторов и матриц могут быть
приведены к меньшим типам данных
– Данные копируется начиная с верхнего левого
угла матрицы/вектора
•
Структуры могут быть приведены к/из
скалярных величин, векторов, матриц и
других структур
ATI Technologies Inc. – Январь 2003
Операторы
Операторы
Arithmetic
-, +, *, /, %
Prefix/postfix
Boolean
++, -&&, ||, ?:
Unary
!, -, +
Comparison
<, >, <=, >=, ==, !=
Assignment
=, -=, +=, *=, /=
Cast
(type)
Comma
,
Structure member
.
Array member
[i]
ATI Technologies Inc. – Январь 2003
Операторы
•
•
•
•
Умножение матрицы и вектора реализовано
с помощью встроенной функции
Оператор извлечения остатка деления (%)
работает как с целыми числами, так и с
числами с плавающей точкой
Сравнение векторов производитсь покомпонентно
Осторожней с целочисленной арифметикой
– HLSL эмулирует целочисленные вычисления
даже если аппаратные средства это не
поддерживают
– Округление может отличаться
ATI Technologies Inc. – Январь 2003
Конструкторы
•
Конструкторы могут быть использованы для
создания и инициализации объектов, как в
C++
– Работает со всеми HLSL типами
float3 v3 = float3(0,0,0);
float4 v4 = float4(0,0,0,0);
float4 v4 = float4(v3,0);
•
Возможна инициализация полей структуры
– Приведение типа происходит автоматически если
поля структуры и данные не совпадают
ATI Technologies Inc. – Январь 2003
Управление исполнением
шейдеров
•
Ветвление
if (expr) then statement [else statement]
•
Циклы
do statement while (expr);
while (expr) statement;
for (expr1;expr2;expr3) statement
•
Циклы поддерживаются всеми моделями
шейдеров
– По необходимости циклы раскручиваются
компилятором
ATI Technologies Inc. – Январь 2003
Функции
•
Похоже на функции в C
– HLSL автоматически проверяет типы
– Поддерживаются прототипы функций
– Аргументы передаются по значению
•
•
•
Рекурсия не поддерживается
Параметры функции могут быть
семантически связаны с данными
Большое кол-во предопределенных функций
– Упрощается разработка
– Оптимизированная реализация
– Функции могут быть переопределены
ATI Technologies Inc. – Январь 2003
Функции
•
•
Аргументы функций могут быть
инициализированы по умолчанию
Функции могут вернуть более одного
значения
float4 foo( in float v,
out float a,
inout float b = 0.5 )
{
a = v * b;
b = v / 2;
return (a + b);
}
ATI Technologies Inc. – Январь 2003
Встроенные Функции
Арифметические функции
VS 1.1
VS 2.0
PS 1.1
PS 1.4
PS 2.0
dot, lerp, saturate
X
X
X
X
X
abs, clamp, isfinite, isnan, max,
min, sign
X
X
X
X
ceil, exp, exp2, floor, fmod, frac,
frexp, isinf, ldexp, log, log2,
log10, modf, pow, round, rsqrt,
smoothstep, sqrt, step
X
X
X
Тригонометрические функции
VS 1.1
VS 2.0
PS 1.1
PS 1.4
PS 2.0
degrees, radians
X
X
X
X
X
acos, asin, atan, atan2, cos,
cosh, sin, sincos, sinh, tan, tanh
X
X
ATI Technologies Inc. – Январь 2003
X
Встроенные Функции
Векторные функции
VS 1.1
VS 2.0
PS 1.1
PS 1.4
PS 2.0
reflect
X
X
X
X
X
all, any, cross, faceforward
X
X
X
X
distance, length, lit, normalize,
refract
X
X
VS 1.1
VS 2.0
PS 1.1
PS 1.4
PS 2.0
mul, transpose
X
X
X
X
X
determinant
X
X
VS 1.1
VS 2.0
X
X
X
Матричные функции
X
Прочие функции
D3DCOLORtoUBYTE4
PS 1.1
ATI Technologies Inc. – Январь 2003
PS 1.4
PS 2.0
?
Встроенные Функции
Текстурные функции
VS 1.1
VS 2.0
PS 1.1
PS 1.4
PS 2.0
X
X
X
tex1D, tex2D, tex3D, texCube
tex1Dproj, tex2Dproj, tex3Dproj,
texCUBEproj, tex1Dbias,
tex2Dbias, tex3Dbias,
texCUBEbias
clip
X
X
ATI Technologies Inc. – Январь 2003
X
X
Семантика Деклараций
•
Аргументы и возвращаемые значения
функций могут быть семанически связаны с
данными ввода/вывода шейдера
– На пример POSITION, TEXCOORD1, и т.д.
•
Константы могут быть привязаны к
регистрам констант
matrix worldViewProj : register(c0);
•
Выборка текстур может быть привызана к
конкретному текстурнику
sampler noiseSampler : register(s0);
ATI Technologies Inc. – Январь 2003
Декларация Текстур
// Декларация объекта текстуры
texture tMarbleSpline;
// Декларация текстурного блока
// и параметров фильтрации
sampler MarbleSplineSampler = sampler_state
{
Texture = (tMarbleSpline);
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Clamp;
AddressV = Clamp;
MaxAnisotropy = 16;
};
ATI Technologies Inc. – Январь 2003
Пример Вершинного Шейдера
float4x4 matWorldViewProj;
float4 vColor : register(c0);
float4 SimpleVS(float4 inPos: POSITION) : POSITION
{
return mul(inPos, matWorldViewProj);
}
struct VS_OUTPUT
{
float4 vPos: POSITION;
float4 vColor: COLOR;
};
VS_OUTPUT ColorVertVS(float4 inPos: POSITION)
{
VS_OUTPUT o;
o.vPos = SimpleVS(inPos);
o.vColor = vColor;
return o;
}
ATI Technologies Inc. – Январь 2003
Пример Пиксельного Шейдера
sampler TextureSampler;
float4 vDiffuse;
float4 vAmbient;
float4 vLightPos;
float4 LightPS(float3 Neye : TEXCOORD0,
float3 Peye : TEXCOORD1,
float2 inTexCoord : TEXCOORD2) : COLOR
{
float3 Leye = normalize(vLightPos – Peye);
float NdotL = dot(Neye, Leye);
return (NdotL * vDiffuse + vAmbient) *
tex2D(TextureSampler, inTexCoord);
}
ATI Technologies Inc. – Январь 2003
Вопросы
ATI Technologies Inc. – Январь 2003