Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 45. Шейдеры GLSL. Псевдо-инстансинг

Поиск

 

Видовая матрица — это матрица 4x4, которая содержит все преобразования объекта в мировых координатах (масштабирование, параллельные перенос и поворот).

Итак, инстансинг — дешёвое в плане производительности копирование уже существующей геометрии. Мы рассмотрим здесь самый лучший вариант копирования геометрии для карт без OpenGL 3.1. Суть псевдо-инстансинга вот в чём: передаём в шейдер мировую (модельно-видовую) матрицу инстанса и рассчитываем в нём позицию каждой вершины.

Ближе к делу.

Про псевдо-подход к инстансингу, предложенный в 2004 году, можете прочитать в документации от NVidia:

http://developer.download.nvidia.com/SDK/9.5/Samples/DEMOS/OpenGL/src/glsl_pseudo_instancing/docs/glsl_pseudo_instancing.pdf.

Перевод можете посмотреть на этом сайте с открытым редактированием (как редактировать материалы см. FAQ на сайте): http://trueimpostors.ucoz.ru/publ/1-1-0-3.

Существует два предложенных варианта реализации инстансинга. Первый — это педавать view трансформации инстанса через текстурные координаты. Этот подход оправдывает себя с незкополигональными объектами. Если полигонов в объекте много, то для создания инстансов лучше подойдёт инстансинг через uniform переменные.

Итак, давайте реализуем псевдо-инстансинг. Вам понадобятся шейдеры следующего вида.

Вершинный, выполняет основную работу:

#version 120

uniform vec4 worldMatrix[3];

uniform mat4 viewMatrix;

 

void main(void)

{

vec4 positionWorld;

vec4 positionView;

positionWorld. x = dot(worldMatrix[0], gl_Vertex);

positionWorld. y = dot(worldMatrix[1], gl_Vertex);

positionWorld. z = dot(worldMatrix[2], gl_Vertex);

positionWorld. w = 1.0;

positionView = viewMatrix * positionWorld;

gl_Position = gl_ProjectionMatrix * positionView;

}

Фрагментный:

void main(void){

gl_FragColor = vec4(0. 5,0. 5,0. 5,1);

}

Рассмотрим вершинный шейдер, который и выполняет инстансинг (фрагментный здесь только окрашивает пиксели). viewMatrix должна содержать видовую матрицу, её легко вытянуть, получив значение GLSceneViewer.Buffer.ModelViewMatrix.worldMatrix — это будущая модельная матрица. Мы, в процессе работы приложения, сформируем её из матриц масштаба, поворота и позиции. Для этого формирования создайте в вашем проекте такую функцию:

function CreateWorldMatrix(Scale, Pos, Axis: TVector; Angle: single): TMatrix;

var

mw: TMatrix;

begin

mw:= MatrixMultiply(CreateRotationMatrix(Axis, 10 * Angle),

CreateTranslationMatrix(Pos));

mw:= MatrixMultiply(mw, CreateScaleMatrix(Scale));

TransposeMatrix(mw);

// Результат - модельная матрица, которую нужно передавать в шейдер.

Result:= mw;

end;

 


Глава 46. Шейдеры GLSL. Пишем сами

 

Пришло время попробовать свои силы в самостоятельном написании GLSL шейдеров. В этой главе я буду давать вам задания по написанию разных шейдеров и буду давать подсказки на всякий случай. Вы можете пользоваться как классом TGLProgramHandle, так и компонентом GLSLShader.

Напишите шейдер, который закрасит кубик в ваш любимый цвет. Подсказка №1: не забудьте, что все числа в шейдере задаются с точкой, т.е. 1.0, 5.2, 3.0.

Используя шейдеры из главы про текстурирование и из главы про освещение по Фонгу, составьте такую шейдерную программу, которая позволит вам рассчитывать освещение для затекстурированного объекта. Подсказка №1: лучше взять за основу шейдер освещения по Фонгу; в вершинном шейдере для использования текстуры нужно рассчитать текстурные координаты, а во фрагментном нужно умножить цвет текущей вершины на ambient и diffuse составляющие.


Глава 47. ATI RenderMonkey

 

Создание шейдеров — трудная задача, поэтому очень удобно создавать их в специальных программах. Также в этих программах очень удобно настраивать шейдер, а уже потом экспортировать его код. Самой известной программой в этой области является RenderMonkey.

Бесплатно скачать самую свежую версию RenderMonkey можно здесь:

http://developer.amd.com/gpu/rendermonkey/Pages/default.aspx

Хорошие уроки по использованию RenderMonkey можно посмотреть здесь:

http://www.dtf.ru/articles/print.php?id=38592

Интерфейс RenderMonkey интуитивен и похож на интерфейс MS Visual Studio. Рабочее пространство разделено на три основные зоны: браузера эффектов, служебных сообщений и визуализации. Согласно терминологии, которой придерживаются разработчики из ATI, совокупность элементов древовидной структуры, отображаемой в окне браузера, называется эффектом. В комплект поставки входят 35 готовых эффектов для OpenGL, позволяющих визуализовать поверхности мыльных пузырей, воды, древесины, металла, меха, огня и др. Двойной щелчок левой клавишей мыши по любому из элементов дерева приводит к вызову соответствующих инструментов его редактирования. Синтаксические конструкции исходного кода шейдеров выделяются разными цветами. Всякое изменение любого элемента приводит к мгновенному перерисовыванию содержимого окна визуализации. Для сохранения результатов используется стандартный формат XML, позволяющий разработчикам легко организовывать импорт настроек эффекта в свои приложения.

Впечатления от RenderMonkey напоминают нечто среднее между опытом работы с материалами в 3DS Max или Maya и опытом программирования в современной оконной среде IDE.

Несмотря на оригинальность общей идеи и множество неоспоримых частных достоинств, RenderMonkey, прежде всего, является оружием конкурентной борьбы в руках ATI. Поэтому нет ничего удивительного в том, что наиболее эффективно и устойчиво она работает с чипами серии Radeon, и вряд ли в будущем нам стоит надеяться на исправление этого перекоса.

В заключение хотелось бы дать пару практических советов всем программистам, желающим перенести эффект из этой среды в GLScene. В RenderMonkey есть «predefined» переменные, они рассчитываются по какому-то алгоритму. Например, fTime0_X выдаёт числа по порядку. Переменные типа color — это обычные vec4; а специальный раздел в среде для них только для удобства выбора цвета.




Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 280; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.137.209 (0.009 с.)