Введение в шейдеры с Ogre3D

Введение в шейдеры с Ogre3D

Сегодня хочу описать использование шейдеров в render-движке Ogre3d. Делается всё это через материалы. Есть в русском вики-сообществе статья на эту тему, но она довольно некачественная.

Для начала разберемся со структурой. Чтобы использовать шейдер в огре нам нужно 4 файла: пиксельный шейдер, вершинный шейдер, файл материала, файл программы.

Начнём с основ. Если вы ещё совсем незнакомы с шейдерами, есть хорошая книга — Shaders for game programming and artists (ISBN: 1-59200-092-4).

Напишем самый простой вершинный шейдер, так как именно с него всё начинается. В него поступают данные по вершине каждого данного полигона.

Float4x4 matViewProjection; struct VS_INPUT

{ float4 Position : POSITION0;

}; struct VS_OUTPUT

{ float4 Position : POSITION0;

};

VS_OUTPUT vs_main(VS_INPUT Input)

{

VS_OUTPUT Output;

Output. Position = mul(matViewProjection, Input. Position); return Output;

}

Откуда берется переменная matViewProjecton вы сможете прочитать ниже.

Hlsl-язык очень похож на с++. Здесь есть те же структуры, функции, типы. Так как после шейдеров в конвейере рендера не может быть никаких преобразываний, некоторые преобразования нам нужно делать вручную.

Следующим этапом будет создание пиксельного шейдера, который на входе получает нашу структуру VS_OUTPUT.

Float4 ps_main() : COLOR0

{ return( float4(1.0f, 0.0f, 0.0f, 1.0f) );

}

Здесь всё просто. Задача пиксельного шейдера — вернуть цвет текущего пикселя, а мы просто возвращаем красный цвет. Здесь компонента первая задаёт цвет. Последняя — уровень прозрачности (rgba). red = 1; green = 0; blue = 0; alpha = 1 — полностью непрозрачный пиксель.

Следующий пункт — написание материала: material MyShader

{ technique

{ pass

{ vertex_program_ref My_Shader_VS

{} fragment_program_ref My_Shader_PS

{}

}

}

}

Как видите, писать код шейдеров можно прямо в материале, но мы этого делать не будем, это не гибко. Мы просто создали ссылку на наши шейдеры. Следующий пункт — .program-файл, который и связывает материал с файлами шейдера: vertex_program My_Shader_VS hlsl

{ source vertex. hlsl target vs_1_1 entry_point vs_main default_params

{ param_named_auto matViewProjection worldviewproj_matrix

}

} fragment_program My_Shader_PS hlsl

{ source pixel. hlsl target ps_2_0 entry_point ps_main default_params

{

//param_named_auto time time_0_x 100.0

}

}

Здесь всё тоже достаточно просто. Мы указываем путь к файлам шейдеров через параметр source, версия шейдеров target, и главные функции(точка входа в шейдер): entry_point.

Следующая часть — default_params. Здесь мы можем передавать в шейдер нужные значения/переменные, а также заранее определённые значения. worldviewproj_matrix — заранее определённая переменная, она передает нам матрицу проекции. На закомментированную строку пока не обращайте внимания.

Сохраняем весь код по файлам: vertext. hlsl, pixel. hlsl, MyShader. material, MyShader. program. В программе к какому-то мешу назначаем ваш материал:

…->setMaterial( "MyShader" );

Если всё работает отлично, ваш объект должен быть закрашен в красный цвет, иначе загляните в файл Ogre. log, там много полезной информации.


Карта сайта


Информационный сайт Webavtocat.ru