ПрограммированиеСтатьиГрафика

Программирование шейдеров на HLSL. (3 стр)

Dizzy эффект.

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

Изображение

Алгоритм для вершинного шейдера:
1) Применяем видовую, мировую и проекционную матрицы на позицию вершины.
2) Сохраняем в текстурные координаты (TEXCOORD0) позицию нетрансформированной вершины для фрагментного шейдера. Т.е. входящими данными у нас будут: POSITION, а исходящими - TEXCOORD0.

Алгоритм для фрагментного шейдера:
1) Получаем интерполированные данные (TEXCOORD0 – т.е. наши текстурные координаты).
2) Вычисляем арктангенс между текстурными координатами x,y.
3) Вычисляем радиус между текстурными координатами. По уравнению окружности:
R2=(x-a)2+(y-b)2. Для удобства примем a = 0, b = 0.
4) Возвращаем цвет, по общей формуле sin(угол + радиус). Т.е. некое смещение, которое из-за функции синуса будет закручивать кольца.

Для того, что бы получить анимированную картинку необходимо еще ввести параметр time, который своим приростом (или наоборот, что повлияет на направление вращения) будет закручивать кольца. Еще можно ввести параметр num_ring, который определяет количество закручиваемых колец. Его надо умножить на радиус, ведь чем больше значение радиуса, тем больше расстояние между кольцами.

При подстановке этих параметров конечная формула примет вид:

цвет=sin(угол + количество колец * радиус + время).

Вот фрагментный шейдер этого эффекта:

float4 main(float2 texCoord: TEXCOORD0) : COLOR
{
   float ang = atan2 (texCoord.x, texCoord.y);
   float rad = dot (texCoord, texCoord);

   return 0.5*(1 + sin (ang + rings * rad + time));
};

И вершинный шейдер:

float4x4 mvp;
//Структура для исходящих данных. Эти данные будут передаваться в растеризатор,
// а потом во фрагментный шейдер.
struct VS_OUTPUT 
{
   float4 Pos: POSITION;
   float2 TexCoord: TEXCOORD0; 
};
// Для входящих данных нам нужна только позиция объекта,
// которая задается в вершинном буфере.
VS_OUTPUT main(float4 Pos: POSITION)
{
   VS_OUTPUT Out;
   //применение видовой, мировой и проекционной матрицы на позицию вершины
   Out.Pos = mul(mvp,Pos);
   //Приравниваем координаты вершины в текстурные координаты.
   Out.TexCoord = normalize(Pos.xy);
   return Out;
}

В качестве более трудных примеров рассмотрим модели освещения.

Страницы: 1 2 3 4 5 6 7 Следующая »

#3D, #Direct3D, #DirectX, #HLSL, #шейдеры

1 июня 2004 (Обновление: 19 июня 2024)

Комментарии [151]