Quest3D - Русскоязычное сообщество

Quest3D => Визуализация, Шейдеры => Тема начата: Sqwer от 05 Июля 2009, 11:49:37



Название: [G] Мега оптимизация
Отправлено: Sqwer от 05 Июля 2009, 11:49:37
Теперь , когда мы научились отсекать ненужные объекты, находящиеся вне пирамиды камеры( http://guest3d.wohlnet.ru/forum/index.php?topic=731.0 ), вновь появилось желание для дальнейшего усовершенствования и оптимизации.

Во многих игровых движках используются продвинутые методы отсечения ненужной геометрии. для индор сцен хорошо себя зарекомендовала BSP технология, а для аутдор - всё сложнее.

Возник ворос: как избавиться от рендеринга невидимого объекта, стоящего за препятствием? (Рисунок ниже)

Данный принцип используется в игре Call Of Duty 4 , те когда боундинг бокс одного предмета находится за другим боксом иного объекта и полностью закрывает его, первый объект не рендится. При том создаётся впечатление что всё это происходит динамически, без использования заранее подготовленных деревьев.

 


Название: Re: [Графика]Мега оптимизация
Отправлено: cashis от 05 Июля 2009, 15:36:20
Мдаа интересненько ! Полезно очень будет, но к сожалению не знаю даже чем помочь. Потом надо бы сделать большую тему по оптимизации и описать все способы оптимизации.


Название: Re: [Графика]Мега оптимизация
Отправлено: Sqwer от 05 Июля 2009, 22:05:47
Не ужели никто не делал больших сцен, содержащих более 200К поликов?!

Пока на ум приходит только следующее:

1) Порталы/сектора , которые делаются "ручками"
2) Первое приближение frustum culling через дерево из AABB
3) Окончательное frustum culling


Название: Re: [Графика]Мега оптимизация
Отправлено: →|๖ۣۜDen|← от 06 Июля 2009, 00:06:09
Есть такой вариант - создать второй рендер с боксами (для меньшого просчёта геометрии) с различными RGB цветами. Запускать проверку на цвет, если есть в сцене такой цвет (r,g,b) то в первом рендере объект рендерится, если нету то ообъект соответсвенно не рендерится.

Существует технология Occlusion Query (http://www.gamedev.ru/code/terms/OcclusionQuery), где уже описан похожий алгоритм.

Всё бы просто - но как в КВЕСТЕ реализовать проверку вырисовывания данного цвета (r,g,b)?


Название: Re: [Графика]Мега оптимизация
Отправлено: Viik от 06 Июля 2009, 10:20:12
Ну Ден правильно пишет, с помощью оклюжен квери это и делаеться. Но все не так просто как проверка цвета:
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html (http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html)

Цитировать
Не ужели никто не делал больших сцен, содержащих более 200К поликов?!
Знакомый делал проект на 20 миллионов поликов, без всяких извратов с кулингом, просто минимум дроу колов и лоды, скорость полностью зависела от процессора.

Подобная оптимизация подходит только для специфических проектов, то что в сцене больше "200К поликов" толком ниочем не говорит.

Цитировать
Данный принцип используется в игре Call Of Duty 4
- источник?


Название: Re: [Графика]Мега оптимизация
Отправлено: Sqwer от 06 Июля 2009, 14:16:59
Цитировать
Данный принцип используется в игре Call Of Duty 4
- источник?
наблюдения через программу 3Д Риппер

Цитировать
с помощью оклюжен квери это и делаеться.
Т.е. он уже зашит в Квест? Насколько я понял, при данной технологии мы всё равно посылаем геометрию на обработку, проводим тестирование, а дальше по результатам теста мы рисуем только необходимое(освобождая от черезмерной нагрузки пиксельный блок) - это так?


Название: Re: [Графика]Мега оптимизация
Отправлено: Sqwer от 07 Июля 2009, 21:01:38
Любопытный факт, квест работает согласно логике, описанной выше в моём посте. Но тут важен порядок следования рендеринга объектов.

1
Т.е. если оъект "А" закрывается объектом "Б", и объект "Б" рендится первее "А", то от объекта "А" вызывается только геометрия, но он не растеризуется.

2
Т.е. если оъект "А" закрывается объектом "Б", и объект "Б" рендится познее "А", то от объекта "А" вызывается геометрия и он  растеризуется.

Логично предположить, что для увеличения скорости нам надо отсортировать объекты по удалению. Чем ближе предмет к камере, тем первее он появляется


Название: Re: [Графика]Мега оптимизация
Отправлено: Viik от 07 Июля 2009, 21:21:12
Так это наверное просто Early Z в работе. Заполняеш деп буффер и не чистиш пока все не отрисуеться (там еще пачка вещей есть которые тоже не нужно делать чтобы все работало). Крайсиз эту штуку интенсивно использует, в моих тенях она поидее тоже работает, если я ее не отключил  ;D
Она не помогает ренедрить сцену с миллионами поликов но позволяет снять нагрузку с пиксельного шейдера, а так как на последних видяхах шейдера унифицированные то и вертексным шейдерам будет легче дышать.

Для Оклюжен Кверис оригинальная геометрия не используеться, использует упрощенную или вообще боксы. Почитай статью там это все расказано, чтобы это заработало в квесте нужно делать кастомные ченелы. Это имеет смысл делать только при специфических особенностях проекта. 99% архитектурной визуализации к этому не относиться, так как камера в любой момент времени может видеть всю сцену целиком. Эффективность "кверис" при этом будет низкая и от нее будет больше тормозов чем толку.

На мой взгляд, при всех остальных "ньюансах" квеста, такая оптимизация даст незначительный результат.


Название: Re: [Графика]Мега оптимизация
Отправлено: →|๖ۣۜDen|← от 09 Июля 2009, 15:49:00
Как писал Sqwer, по вызову геометрии, зависящей от порядка,
Цитировать
если оъект "А" закрывается объектом "Б", и объект "Б" рендится первее "А", то от объекта "А" вызывается только геометрия, но он не растеризуется.
удалось наконец вызывать рендер геометрии в зависимости от расстояния от камеры до самого объекта. Т.е. чем ближе объект к камере, тем выше приоритет рендеринга этого объекта. Пару слов как это работает:
в массив заносятся данные о расстоянии объектов к камере, затем эти данные сортируются, и в том порядке в каком выстроились расстояния (по возрастанию), происходит вызов объектов. всё динамически, и менятся порядок в зависимости от того как меняется дистанция.
Объекты должны быть в паблик статусе (-> Make Channel Public) и занесены в менеджере массивов.
Итак, единственно что следует сделать, при добавлении собственных "сотен" объектов (ибо оптимизацию можно проверить с большим кол-вом объектов :)) это преобразовать объекты в паблик, узнать расстояния, и занести всё в массив.
Тестим. В квесте так никто не делал наверно ещё. :)

P.s. Интересное видео демонстрирующее оптимизацию объектов, скрывающихся за объектами на первом плане  http://www.umbrasoftware.com/index.php/player


Название: Re: [Графика]Мега оптимизация
Отправлено: Sqwer от 09 Июля 2009, 22:40:18
Спасибо, ->Den<-, всё работает, объекты сортируются по расстоянию до активной камеры и рендятся соответственно этой сортировке.

и всё же очень хочется написать собственный канал ( используя SDK) чтоб он всё делал автоматически, а располагался между каналом Renderer и множеством каналов 3D object.

PS не доверяю квестовскому Lua и OO, из-за того что не знаю их скорость исполнения.


Название: Re: [Графика]Мега оптимизация
Отправлено: Sqwer от 25 Июля 2009, 08:47:23
Для многих эффектов часто требуется глубина сцены.

Viik подсказал следующий алгоритм рендеринга:
1) Рендер глубины с записью в Z буфер при отключенном цвете
2) Рендер непрозрачных объектов сцены без записи в Z буфер.
3) Рендер прозрачных объектов по сортировке.

Собственно вопрос: как отключить цветовой рендер в первом стейте 1)?  (не нашёл я)

Суть метода в том, что мы рендим сцену сверхдещёвым шейдом глубины и заполняем З буфер, на основе которого будет выполнятся Early Z  для уже более тяжёлых шейдов, где очень важен овердрав.


Название: Re: [Графика]Мега оптимизация
Отправлено: Viik от 25 Июля 2009, 13:32:18
Добавь вот этот рендер стейт при рендере глубины:
ColorWriteEnable = 0;


Название: Re: [Графика]Мега оптимизация
Отправлено: DimiS от 26 Июля 2009, 18:39:42
Для многих эффектов часто требуется глубина сцены.

а можно узнать для каких? С шейдерами только знакомлюсь пока, хочу для себя систематизировать какой финт ушами когда может понадобится применить.

Насколько я понял, рендер глубины с записью в Z-буффер служит потом ещё и для оптимизации при нормальном рендере объектов. Чёто типа оклюжен кулинга получается, я правильно понял?


Название: Re: [Графика]Мега оптимизация
Отправлено: Viik от 28 Июля 2009, 14:24:16
Цитировать
а можно узнать для каких?
Банальные DOF, SSAO, атмосферный скатеринг и скатеринг воды, деферред тени, для Motion Blur тоже можно использовать.

Цитировать
Насколько я понял, рендер глубины с записью в Z-буффер служит потом ещё и для оптимизации при нормальном рендере объектов. Чёто типа оклюжен кулинга получается, я правильно понял?
Да, причем это может критически сказаться на производительности. Незаменимая вещь при высоком филрейте.


Название: Re: [Графика]Мега оптимизация
Отправлено: DimiS от 29 Июля 2009, 20:59:01
SSAO, атмосферный скатеринг и скатеринг воды, деферред тени,
вот этих пока не знаю но думаю потом разберусь :)

Да, причем это может критически сказаться на производительности. Незаменимая вещь при высоком филрейте.
Я не знаю насколько часто применяются вертекс шейдеры изменяющие геометрию. Могут ли они стать тормозом для такого метода, их ведь надо будет применять в обоих проходах?
Не возникает ли проблем при отрисовке второго прохода из-за того, что глубина уже как-бы занята первым проходом. Т.е. видяха считает, что не нужно отрисовывать пиксели даже ближайшего объекта, ведь у них точно такая же глубина как у уже отрисованых? Хотя я бы попробовал уменьшить немного фар плейн для второго прохода.
Насколько данный способ оптимизации сравним с сортировкой объектов по расстоянию до камеры, есть ли смысл использовать сортировку, если используется рендер глубины?


Название: Re: [Графика]Мега оптимизация
Отправлено: Viik от 30 Июля 2009, 00:35:25
Цитировать
Я не знаю насколько часто применяются вертекс шейдеры изменяющие геометрию. Могут ли они стать тормозом для такого метода, их ведь надо будет применять в обоих проходах?
Даже если шейдер сложный, как скининг например, всеравно видяха его посчитает быстрее чем ЦПУ, поэтому тут особого выбора то и нет. Как бы могут, но на последних видяхах шейдера унифицированы на уровне железа, тобиш разгружая пиксельный шейдер легче будет дышать и вертексному.

Цитировать
Не возникает ли проблем при отрисовке второго прохода из-за того, что глубина уже как-бы занята первым проходом. Т.е. видяха считает, что не нужно отрисовывать пиксели даже ближайшего объекта, ведь у них точно такая же глубина как у уже отрисованых? Хотя я бы попробовал уменьшить немного фар плейн для второго прохода.
На втором проходе делаеться только тест глубины, запись в буфер не делаеться. А видяха сама отсекает не прошедшие тест фрагменты еще до пиксельного шейдера. Есть ряд условий при которых автоматический кулинг работать не будет. Более подробно в GPU Programming guide 7xxx от Нвидии.

Цитировать
Насколько данный способ оптимизации сравним с сортировкой объектов по расстоянию до камеры, есть ли смысл использовать сортировку, если используется рендер глубины?
Это разные вещи, сортировка в первую очередь нужна для блендинга полупрозрачной геометрии и кулинга на уровне боундинг боксов. Ничто не мешает использовать оба варианта сразу.


Название: Re: [Графика]Мега оптимизация
Отправлено: Sqwer от 04 Августа 2009, 15:00:35
И вновь проблемы:

При раздельном рендере полигонов  , находящихся на одной плоскости, возникает впечатление "запаздывания " результатов одного от другого. В итоге при изменении положения камеры появляется эффект наложения обного объекта на другой...

Viik подсказал рендить объекты прямиком через Chanel Caller, всё работает на ура. Но как быть с рендером в текстуру? И как в шедах указать параметры источников света, если они определяются в канале Render ?

По поводу первого:  у нас есть вызов из бэк буфера, таким образом можно глубину закодировать 3 цвета RGB , а потом при надобнасти восстановить. Но это лишний гемор.., и скорее всего есть другой метод решения проблемы.

Пример возможности использования бэкбуфера прилагается 422

По поводу второго: в шейдер можно передать параметры напрямую через CHANNELVECTOR и CHANNELVALUE. Это тоже - гемор...

Исправлено ли это в Квесте версии 4.3.х ?


Название: Re: [Графика]Мега оптимизация
Отправлено: Viik от 05 Августа 2009, 17:50:44
Код:
При раздельном рендере полигонов  , находящихся на одной плоскости, возникает впечатление "запаздывания " результатов одного от другого. В итоге при изменении положения камеры появляется эффект наложения обного объекта на другой...
Это из-за того что положение камеры считаеться несколько раз за один кадр, сколько раз вызываеться столько раз и пересчитываеться, сделай математику в ней принудидельно Ван Тайм.
Код:
Viik подсказал рендить объекты прямиком через Chanel Caller, всё работает на ура. Но как быть с рендером в текстуру? И как в шедах указать параметры источников света, если они определяются в канале Render ?
Они "определяються" там где ты их вызываеш, Рендер ченел тут не нужен, просто в ченел коллере их вызывай и все.