AA-эмуляция в Deferred render
Вложений: 1
Потихоньку (ага, скромник какой нашелся) осваиваю Unity3d. Решил делиться знаниями.
Начиная с версии 3.0 был введен deferred render. Что это такое некоторые знают, некоторые слышали, а кто-то видит эти слова вместе в первый раз. Если кратко, то deferred render - это техника, позволяющая использовать много пиксельных источников света без существенного падения ФПС. Это достигается за счет того, что освещение просчитывается не во время рендера сцены, а после него - то есть только для тех пикселей, что попали на экран. Это довольно удобная техника, которая, к тому же, в unity хорошо дружит с припаянным Beast Lightmapper и обеспечивает красивое мягкое перетекание динамических теней в статические. Недостатком deferred render-а является то, что он несовместим с хардварным АнтиАлиасингом (АА). Но беда не велика - это достаточно просто исправить, что я вам сейчас и покажу. Для начала - принцип. Хардварный АА работает примерно так: для устранения "лесенок" для рассчета цвета пиксела используется значение не одного пиксела, а нескольких. То есть видеокарта просчитывает для одного пиксела рендер несколько раз со смещением, затем смешивает полученные цвета и выдает конечный результат. Получается весьма красиво и гладко. Мы будем делать то же самое, но другими путями. Как? Очень просто:
Что нам для этого понадобится в сцене:
Скрипт, который надо вешать на Главную камеру (JavaScript) : Код:
var BigRenderScale : float = 1.5; Код:
private var mat : Material; Для наглядности рекомендую отключить на время компонент "Camera" дополнительной камеры и настроить Edge Blur визуально. Параметр "BigRenderScale" больше 2х делать ОЧЕНЬ не рекомендую. Помните, нагрузка на систему возрастает в квадратичной зависимости от этого параметра. Больше рендер - больше пикселей - меньше ФПС. Скорее всего оптимальным будет настроить "BigRenderScale"=1.3, и дальше "плясать" с Edge Blur параметрами. Результат усилий - в аттаче. P.S. Кусочки скрипта, ответственные за GL-часть, нагло позаимствованны с соседнего ресурса. Но особой мыслительной ценности в них нет, так что копирайта они не достойны :-D P.P.S. По этому же принципу возможны другие реализации, и скорее всего моя - не самая быстрая. Но она работает. |
Ответ: AA-эмуляция в Deffered render
Я отношусь к той группе, которая сочетание этих слов видит впервые.
И таки ты прав: такой способ далеко не самый быстрый. Гораздо быстрее (хотя и менее качественно, но разницу только профессионалы, пожалуй, заметят) размывать бекбуфер по маске, полученной с помощью edge detection. Например, как тут http://orenk2k.blogspot.com/2010/10/...-aliasing.html ЗЫ. deferred. Ну и правильнее все же Deferred Shading, а не Rendering, т.к. отложено именно освещение, а не рендеринг. Хотя сейчас говорят и так, и эдак, так что пофиг. |
Ответ: AA-эмуляция в Deferred render
Вложений: 1
Цитата:
Есть предположения, как это побороть? |
Ответ: AA-эмуляция в Deferred render
|
Ответ: AA-эмуляция в Deferred render
Цитата:
|
Ответ: AA-эмуляция в Deferred render
|
Ответ: AA-эмуляция в Deferred render
Цитата:
|
Ответ: AA-эмуляция в Deferred render
Нашел более "вкусный" фильтр, по результату - примерно так же хорошо, как и с большим рендером, зато производительность падает значительно меньше.
Линк на тему на официальном форуме Применение: Просто вешаем на главную камеру самым первым Image Effect-ом. Если число включенных Image Effect-ов перед этим скриптом нечетное - не работает О_о. |
Ответ: AA-эмуляция в Deferred render
Такое чувство, что размываются не только границы. Ну это если сильно присматриваться.
UPD. Так и есть. Указано в недостатках в описании исходного алгоритма ( http://www.gamedev.net/community/for...opic_id=580517 ). А вообще полезная ссылка. |
Часовой пояс GMT +4, время: 07:20. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot