Скачать презентацию Продвинутое использование Open GL Визуализация зеркальных Скачать презентацию Продвинутое использование Open GL Визуализация зеркальных

11e67b76050a76c54424bc5dbc63e9de.ppt

  • Количество слайдов: 45

Продвинутое использование Open. GL Продвинутое использование Open. GL

 Визуализация зеркальных поверхностей Визуализация трехмерных ландшафтов Оптимизация производительности Open. GLприложений Визуализация зеркальных поверхностей Визуализация трехмерных ландшафтов Оптимизация производительности Open. GLприложений

Визуализация зеркальных поверхностей Визуализация зеркальных поверхностей

Особенности визуализации зеркальных поверхностей Данные поверхности отражают окружающее их пространство Простейший пример – плоское Особенности визуализации зеркальных поверхностей Данные поверхности отражают окружающее их пространство Простейший пример – плоское зеркало При визуализация отражений на криволинейных поверхностях в реальном времени – более сложная задача При ее решении обычно прибегают к алгоритмическим упрощениям Кубические текстуры

Визуализация плоского зеркала Визуализация плоского зеркала

Принцип зеркального отражения P n r v m r’ Q P’ Свет от источника Принцип зеркального отражения P n r v m r’ Q P’ Свет от источника света отражается от объекта во все стороны. При этом часть света достигает зеркальной поверхности Часть света отражается от зеркальной поверхности и достигает глаза наблюдателя по измененной траектории В итоге, наблюдатель видит мнимое изображение отраженного объекта за зеркалом m

Что такое отражение? В зеркале мы видим отражение - мнимый объект, визуально расположенный за Что такое отражение? В зеркале мы видим отражение - мнимый объект, визуально расположенный за зеркалом Хотя на самом деле за зеркалом объекта нет, необходимо нарисовать его так, как если бы он там находился Для визуализации сцены, содержащей плоское зеркало, необходимо нарисовать ее дважды – оригинал и отражение сцены

Свойства плоского отражения Каждая точка отражения получена путем отражения соответствующей точки оригинала от плоскости Свойства плоского отражения Каждая точка отражения получена путем отражения соответствующей точки оригинала от плоскости зеркала Отраженная полигональная сетка содержит столько же вершин и граней, что и оригинал Точки, расположенные за плоскостью зеркала, в нем не отражаются Направление обхода вершин в гранях отраженного объекта противоположно обходу вершин оригинального объекта

Способы построения отражения Построить отражение можно двумя способами: «Отразить» сцену относительно плоскости зеркала и Способы построения отражения Построить отражение можно двумя способами: «Отразить» сцену относительно плоскости зеркала и нарисовать ее глядя «в зазеркалье» «Отразить» положение наблюдателя относительно плоскости зеркала, и нарисовать сцену, глядя на нее «из зазеркалья»

Способ 1 Взгляд в Зазеркалье Способ 1 Взгляд в Зазеркалье

Отражение объекта Отражение полигональной сетки осуществляется путем отражения всех ее вершин Требует большого количества Отражение объекта Отражение полигональной сетки осуществляется путем отражения всех ее вершин Требует большого количества вычислений для каждой вершины Усложняется применение мировых преобразований к отраженному объекту Можно модифицировать матрицу мировых преобразований оригинального объекта так, чтобы переместить его за зеркало Уже лучше, но данную операцию необходимо проделать для каждой матрицы мировых преобразований объекта

Способ 2 Взгляд из зазеркалья Способ 2 Взгляд из зазеркалья

Отражение наблюдателя Необходимо модифицировать матрицу камеры так, чтобы перенести точку наблюдения за плоскость зеркала, Отражение наблюдателя Необходимо модифицировать матрицу камеры так, чтобы перенести точку наблюдения за плоскость зеркала, заставив наблюдателя смотреть из зеркала Все вычисления сводятся к отражению точки начала координат и трех координатных осей Данные вычисления выполняются всего раз для каждого зеркала

Построение матрицы отражения наблюдателя Извлекаем вектора координатных осей и точку начала координат из оригинальной Построение матрицы отражения наблюдателя Извлекаем вектора координатных осей и точку начала координат из оригинальной матрицы Вычисляем вектор mirror. To. Origin направленный из точки на плоскости отражения к началу координат Вычитаем из координатных осей их удвоенную проекцию на вектор нормали Мнимый объект расположен за зеркалом на том же расстоянии, что и оригинал Смещаем точку начала координат на удвоенную проекцию вектора mirror. To. Origin на вектор нормали Сохраняем вектора в матрицу отражения

void Build. Mirror. Matrix( const float *source. Matrix, const Vector 3 d &mirror. Normal, void Build. Mirror. Matrix( const float *source. Matrix, const Vector 3 d &mirror. Normal, const Vector 3 d &mirror. Point, float *destination. Matrix) { Vector 3 d x. Axis(&source. Matrix[0]); Vector 3 d y. Axis(&source. Matrix[4]); Vector 3 d z. Axis(&source. Matrix[8]); Vector 3 d origin(&source. Matrix[12]); Vector 3 d mirror. To. Origin = origin - mirror. Point; x. Axis -= mirror. Normal. Project(x. Axis) * 2; y. Axis -= mirror. Normal. Project(y. Axis) * 2; z. Axis -= mirror. Normal. Project(z. Axis) * 2; origin -= mirror. Normal. Project(mirror. To. Origin) * 2; x. Axis. Store. Vector(&destination. Matrix[0]); y. Axis. Store. Vector(&destination. Matrix[4]); z. Axis. Store. Vector(&destination. Matrix[8]); origin. Store. Point(&destination. Matrix[12]); }

Отсечение объектов выходящих за плоскость зеркала Зеркало отражает лишь те объекты, которые расположены перед Отсечение объектов выходящих за плоскость зеркала Зеркало отражает лишь те объекты, которые расположены перед отражающей поверхностью При построении отражения рисуются все объекты сцены Объекты могут частично находиться за плоскостью зеркала, а частично перед ним При рисовании отражения необходимо отсекать часть сцены, находящуюся за зеркалом Несоблюдение данного правила может привести к визуальным артефактам

Применение плоскостей отсечения Open. GL позволяет задать по крайней мере 6 пользовательских плоскостей отсечения Применение плоскостей отсечения Open. GL позволяет задать по крайней мере 6 пользовательских плоскостей отсечения Уравнения плоскостей отсечения задаются при помощи команды gl. Clip. Plane Плоскость отсечения включается/выключается при помощи команд gl. Enable/gl. Disable(GL_CLIP_PLANEi) Open. GL отсекает примитивы либо части примитивов, находящиеся по одну из сторон каждой из плоскостей отсечения

Команда gl. Clip. Plane Задает уравнение одной из плоскостей отсечения, заданное в виде: Nx*x Команда gl. Clip. Plane Задает уравнение одной из плоскостей отсечения, заданное в виде: Nx*x + Ny*y + Nz*z + D = 0 Синтаксис: gl. Clip. Plane(GLenum plane, const GLdouble *equation) plane – номер плоскости – GL_CLIP_PLANEi equation – адрес массива из 4 -х чисел типа double, задающих коэффициенты уравнения плоскости Коэффициенты Nx, Ny, Nz задают нормаль к плоскости, направленную в полупространство с рисуемыми примитивами

Пример gl. Enable(GL_CLIP_PLANE 0); double clip. Plane[4] = {0, -1, 0, 0}; gl. Clip. Пример gl. Enable(GL_CLIP_PLANE 0); double clip. Plane[4] = {0, -1, 0, 0}; gl. Clip. Plane(GL_CLIP_PLANE 0, clip. Plane);

Отсечение по границам зеркала Область отражения должна быть ограничена границами отражающей поверхности Сделать это Отсечение по границам зеркала Область отражения должна быть ограничена границами отражающей поверхности Сделать это можно, при помощи буфера трафарета Плоскость зеркала рисуется в буфере трафарета и используется в качестве области для рисования отражения

Рисуем зеркало в буфер трафарета // рисуем зеркало в буфер трафарета (не модифицируя буферы Рисуем зеркало в буфер трафарета // рисуем зеркало в буфер трафарета (не модифицируя буферы цвета и глубины) if (g_use. Stencil) { gl. Enable(GL_STENCIL_TEST); gl. Color. Mask(GL_FALSE, GL_FALSE); gl. Depth. Mask(GL_FALSE); gl. Stencil. Op(GL_REPLACE, GL_REPLACE); gl. Stencil. Func(GL_ALWAYS, 1, 255); Draw. Mirror(false); gl. Color. Mask(GL_TRUE, GL_TRUE); gl. Depth. Mask(GL_TRUE); gl. Disable(GL_STENCIL_TEST); }

Рисуем отражение в область зеркала gl. Front. Face(GL_CW); if (g_draw. Reflection) { gl. Enable(GL_STENCIL_TEST); Рисуем отражение в область зеркала gl. Front. Face(GL_CW); if (g_draw. Reflection) { gl. Enable(GL_STENCIL_TEST); gl. Stencil. Func(GL_EQUAL, 1, 255); gl. Stencil. Op(GL_KEEP, GL_KEEP); gl. Enable(GL_CLIP_PLANE 0); double clip. Plane[4] = {0, -1, 0, 0}; gl. Clip. Plane(GL_CLIP_PLANE 0, clip. Plane); gl. Load. Matrixf(mirror. Matrix); Set. Lights(); Animate. Cube(); Draw. Cube(); gl. Disable(GL_CLIP_PLANE 0); gl. Disable(GL_STENCIL_TEST); } gl. Front. Face(GL_CCW);

Рисование оригинальной части сцены Объекты сцены, вызывающие отражение, должны быть нарисованы в последнюю очередь Рисование оригинальной части сцены Объекты сцены, вызывающие отражение, должны быть нарисованы в последнюю очередь Если нарисовать объекты до их отражений, то содержимое буфера глубины может быть испорчено объектами, расположенными позади зеркала, что вызовет некорректное построение отраженного изображения

Финальная картинка Финальная картинка

Визуализация криволинейных отражающих поверхностей Визуализация криволинейных отражающих поверхностей

Использование кубических текстур Кубическая текстура представляют собой развертку шести граней куба, каждая грань которого Использование кубических текстур Кубическая текстура представляют собой развертку шести граней куба, каждая грань которого содержит текстуру Каждая из 6 текстур содержит изображение окружающей среды, которое видно из центра куба в одном из 6 направлений

Принцип реализации эффекта отражения с использованием GLSL Вершинный шейдер Трансформация вершины Трансформация нормального вектора Принцип реализации эффекта отражения с использованием GLSL Вершинный шейдер Трансформация вершины Трансформация нормального вектора и видового вектора в систему координат наблюдателя Фрагментный шейдер Нахождение отраженного вектора в данной точке поверхности Извлечение данных из кубической текстуры

Исходный код шейдеров, выполняющих наложение текстуры окружающей среды varying vec 3 Normal; varying vec Исходный код шейдеров, выполняющих наложение текстуры окружающей среды varying vec 3 Normal; varying vec 3 View; void main(void) { gl_Position = ftransform(); Normal = normalize(gl_Normal. Matrix * gl_Normal); View = (gl_Model. View. Matrix * gl_Vertex). xyz; } uniform sampler. Cube Environment. Texture; varying vec 3 Normal; varying vec 3 View; void main(void) { vec 3 tex. Coord = reflect(View, Normal); gl_Frag. Color = texture. Cube(Environment. Texture, tex. Coord); }

Результат работы Результат работы

Визуализация трехмерных ландшафтов Визуализация трехмерных ландшафтов

 Трехмерный ландшафт – сцена, моделирующая некоторый участок земной поверхности Характерной особенностью являются большие Трехмерный ландшафт – сцена, моделирующая некоторый участок земной поверхности Характерной особенностью являются большие объемы информации, затрачиваемые на представление обширных пространств как правило, повторяющихся элементов ландшафты не содержат

Способы представления в памяти ЭВМ Регулярной сетки высот Иррегулярной сетки вершин и связей обычная Способы представления в памяти ЭВМ Регулярной сетки высот Иррегулярной сетки вершин и связей обычная полигональная сетка В виде посегментной карты высот

Карта высот Карта высот

Характеристики Простота представления и обработки данных можно использовать обычный графический редактор Игнорирование особенностей равнинных Характеристики Простота представления и обработки данных можно использовать обычный графический редактор Игнорирование особенностей равнинных и холмистых участков ландшафта Избыток либо недостаток данных Невозможность представления пещер, впадин и т. п.

Иррегулярная сетка Иррегулярная сетка

Характеристики Позволяет учитывать особенности участков ландшафта На представление равнинных участков требуется меньше вершин и Характеристики Позволяет учитывать особенности участков ландшафта На представление равнинных участков требуется меньше вершин и полигонов Дает возможность представления впадин, пещер и т. п. Сложность обработки и визуализации

Посегментные карты высот Ландшафт разбивается на сегменты определенного размера Каждый блок может быть представлен Посегментные карты высот Ландшафт разбивается на сегменты определенного размера Каждый блок может быть представлен в виде регулярной или нерегулярной сетки высот Достоинства: Возможность представления огромных пространств Каждый блок может иметь по несколько вариантов сеток высот для разных уровней детализации Недостатки Усложнение стыковки блоков Усложнение редактирования

Пример Пример

Оптимизация производительности Open. GL-приложений Оптимизация производительности Open. GL-приложений

 Современные графические ускорители позволяют обрабатывать сотни миллионов вершин и миллиарды фрагментов в секунду Современные графические ускорители позволяют обрабатывать сотни миллионов вершин и миллиарды фрагментов в секунду Всегда ли этого достаточно?

Пример Представление 3 D ландшафта в виде регулярной полигональной сетки размером 4000*4000 32 млн. Пример Представление 3 D ландшафта в виде регулярной полигональной сетки размером 4000*4000 32 млн. треугольников ≈16 млн. вершин (triangle strip) ≈32 млн. индексов ≈ 256 Mb >128 Mb RGBA-текстура 4096*4096 64 Mb Визуализация такого ландшафта будет происходить со скоростью не более 1 -2 кадров в секунду Значительная часть времени будет затрачиваться на обработку вершин треугольников, которые не будут нарисованы

Способы повышения производительности Загрузка данных по частям Текстуры и вершины загружаются в Open. GL Способы повышения производительности Загрузка данных по частям Текстуры и вершины загружаются в Open. GL по мере необходимости Объекты, не попадающие в область видимости не должны рисоваться вообще bounding volumes Иерархическое разбиение пространства Quad tree/Oct tree/порталы Использование уровней детализации геометрии и текстур Рисование ближних объектов в первую очередь Минимизация частоты смены текстур и шейдеров Использование многопоточности

Оптимизация «узких мест» в приложении Выявление проблемного участка в приложении CPU-bound Geometry-bound Fillrate-bound Применение Оптимизация «узких мест» в приложении Выявление проблемного участка в приложении CPU-bound Geometry-bound Fillrate-bound Применение методов оптимизации, специфических для проблемной ситуации Следуйте рекомендациям производителей графического железа