HLSL основы.
Итак, во многих играх мы видим реалистичный ландшафт, воду тени и т.д. И все это делает шейдер. Давайте же разберемся, что за монстр та такой этот шейдер. Существует два вида шейдера: вершинный и пиксельный. Вершинный шейдер предназначен, как следует из названия, для работы с набором вершин. В нем будут производится трансформации и освещение вершин. Пиксельный шейдер предназначен для финального расчета цвета каждой точки сцены. Он заменяет процесс мультитекстурирования в пиксельном конвейере Direct3D. Ни вершинный, ни пиксельный шейдер не имеют представления о данных, поступающих в них. Итак, начнем изучать этот язык:
• bool – true или false
• int – целое число
• half – 16 битное дробноем число
• float – 32 битное дробное число
• double – 64 битное дробное число
Объявление переменных происходит как в C++ :
Float angle;
Float bias = 0.5;
Int index;
Int indexarray[3] = {1,2,3};
Также можем добовлять к переменным static или extern Первый делает переменную статичную (нельзя изменять ее), второй наоборот. Объявляются так:
static int index;
extern int ui;
вектор задается так:
vector direction; или float3 direction; или float direction[3];
матрицы объявляются подобным образом:
matrix transform; float2x2 transform;
структуры могут состоять из величин различных типов:
struct VS_OUTPUT { Float4 pos: position; Float4 diffuse: color; };
Операторы такие же как в c++: =, +=, -+, *=, /=, !, +, -, *, /, %, &&, ||, ?, <, >, !=, ==, <=, >=, ++, --, ., [] , (); Основные функции(не все):
Cos(x) – косинус x
Sin(x) – синус x
Distance(a,b) – растоянме между a и b
Dot(x, y) – вычисление dot prodact между двумя векторами x и y
Faceforward(n,I,g) – проверка видимости полигона
Frac(x) – возвращает дробную часть x
Length(x) – возвращает длину вектора
Max(a,b) – максимум
Min(a,b) – минимум
Mul(a,b) – умножает матрицы
Sqrt(x) – квадратный корень
Tex2d(s,t) – чтение из 2d текстуры И другие.
Повторяюсь здесь представлен не полный список функций. Вот собственно и все по теории. Теперь перейдем к практике, напишем простейший шейдер:
Float4x4 matWorldViewProject; //произведение всех матриц(World, ViewMatrix, ProjectMatrix)
Struct VS_Input { Float4 pos: POSITION; };
Struct VS_Output { Float4 pos: POSITION; };
VS_Output main(VS_Input in)
{
VS_Output Out = (VS_Output)0;
Out.Pos = mul(In.pos, matWorldViewProject);
Return Out;
};
Ну вот очень простой шейдер, после применения которого объект станет белым, т.е. станет игнорировать свет. Ну вот в принципы и все.
|