|
07.12.2010, 01:54
|
#1
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
AA-эмуляция в Deferred render
Потихоньку (ага, скромник какой нашелся) осваиваю Unity3d. Решил делиться знаниями.
Начиная с версии 3.0 был введен deferred render. Что это такое некоторые знают, некоторые слышали, а кто-то видит эти слова вместе в первый раз. Если кратко, то deferred render - это техника, позволяющая использовать много пиксельных источников света без существенного падения ФПС. Это достигается за счет того, что освещение просчитывается не во время рендера сцены, а после него - то есть только для тех пикселей, что попали на экран. Это довольно удобная техника, которая, к тому же, в unity хорошо дружит с припаянным Beast Lightmapper и обеспечивает красивое мягкое перетекание динамических теней в статические.
Недостатком deferred render-а является то, что он несовместим с хардварным АнтиАлиасингом (АА). Но беда не велика - это достаточно просто исправить, что я вам сейчас и покажу.
Для начала - принцип. Хардварный АА работает примерно так: для устранения "лесенок" для рассчета цвета пиксела используется значение не одного пиксела, а нескольких. То есть видеокарта просчитывает для одного пиксела рендер несколько раз со смещением, затем смешивает полученные цвета и выдает конечный результат. Получается весьма красиво и гладко.
Мы будем делать то же самое, но другими путями. Как? Очень просто: - Наложим на камеру эффект размытия граней (есть в стардартной поставке имедж эффектов)
- Отрендерим мир в разрешении, превышающем экранное в некоторое число раз;
- Отрисуем отрендеренное уже в экранное разрешение (т.е. с уменьшением) и наложим GUI и HUD элементы.
Что нам для этого понадобится в сцене: - Слой "GUI", в который мы поместим всё, что должно быть отрисовано после рендера мира;
- Главная камера с наложенным на неё эффектом "Edge blur" и скриптом "захвата" текстуры;
- Дополнительная камера с ортогональной проекцией, с Culling Mask, содержащей в себе только слой GUI, компонентом GUILayer, скриптом финального вывода картинки и параметром "Depth", большим чем у Главной камеры.
Скрипт, который надо вешать на Главную камеру (JavaScript) :
var BigRenderScale : float = 1.5;
static var big_render : RenderTexture;
function Start() {
// Создадим рендер-текстуру
big_render = RenderTexture(Screen.width*BigRenderScale, Screen.height*BigRenderScale, 24);
big_render.Create();
// И установим её
gameObject.camera.targetTexture = big_render;
}
Скрипт для Дополнительной камеры (JavaScript) :
private var mat : Material;
function Start() {
// Создадим материал с простейшим шейдером
mat = new Material("Shader \"Texture Simple\" {" +
" Properties { " +
" _MainTex (\"Base (RGB)\", 2D) = \"white\" " +
" } " +
" SubShader { " +
" Pass { " +
" SetTexture [_MainTex] " +
"}" +
"}" +
"}"
);
}
function OnPostRender() {
// Установим материалу текстуру из рендера Главной камеры
mat.SetTexture("_MainTex", AA_emul_grab.big_render);
// Прямоугольник с текстурными координатами
GL.PushMatrix();
mat.SetPass(0);
GL.Color(Color(1,1,1,1));
GL.LoadOrtho();
GL.Begin(GL.QUADS);
GL.TexCoord(Vector3(0,0,0));
GL.Vertex3(0,0,0);
GL.TexCoord(Vector3(0,1,0));
GL.Vertex3(0,1,0);
GL.TexCoord(Vector3(1,1,0));
GL.Vertex3(1,1,0);
GL.TexCoord(Vector3(1,0,0));
GL.Vertex3(1,0,0);
GL.End();
GL.PopMatrix();
}
Особенности:
Для наглядности рекомендую отключить на время компонент "Camera" дополнительной камеры и настроить Edge Blur визуально. Параметр "BigRenderScale" больше 2х делать ОЧЕНЬ не рекомендую. Помните, нагрузка на систему возрастает в квадратичной зависимости от этого параметра. Больше рендер - больше пикселей - меньше ФПС. Скорее всего оптимальным будет настроить "BigRenderScale"=1.3, и дальше "плясать" с Edge Blur параметрами.
Результат усилий - в аттаче.
P.S.
Кусочки скрипта, ответственные за GL-часть, нагло позаимствованны с соседнего ресурса. Но особой мыслительной ценности в них нет, так что копирайта они не достойны
P.P.S.
По этому же принципу возможны другие реализации, и скорее всего моя - не самая быстрая. Но она работает.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
Последний раз редактировалось Taugeshtu, 07.12.2010 в 02:36.
Причина: Орфография))
|
(Offline)
|
|
Эти 6 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
|
|
07.12.2010, 02:11
|
#2
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: AA-эмуляция в Deffered render
Я отношусь к той группе, которая сочетание этих слов видит впервые.
И таки ты прав: такой способ далеко не самый быстрый. Гораздо быстрее (хотя и менее качественно, но разницу только профессионалы, пожалуй, заметят) размывать бекбуфер по маске, полученной с помощью edge detection. Например, как тут http://orenk2k.blogspot.com/2010/10/...-aliasing.html
ЗЫ. defe rred. Ну и правильнее все же Deferred Shading, а не Rendering, т.к. отложено именно освещение, а не рендеринг. Хотя сейчас говорят и так, и эдак, так что пофиг.
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
07.12.2010, 02:26
|
#3
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
Ответ: AA-эмуляция в Deferred render
размывать бекбуфер по маске
|
Строго говоря, Edge Blur этим и занимается - детектирует грани и моет что нашел. Но то ли он это сильно неумело делает, то ли у меня глаз такой острый - мне очень неприятно наблюдать ДИКОЕ заблюривание заднего плана. Как правило чем дальше - тем больше граней на квадратный пиксель, и задний план превращается в кашу. В аттаче - иллюстрация.
Есть предположения, как это побороть?
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
|
(Offline)
|
|
07.12.2010, 11:23
|
#4
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: AA-эмуляция в Deferred render
Извини, мне Knightmare запрещает помогать юнитоидам.
__________________
Последний раз редактировалось .Squid, 07.12.2010 в 17:48.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
07.12.2010, 14:15
|
#5
|
Нуждающийся
Регистрация: 19.11.2008
Адрес: Украина, Луганск
Сообщений: 72
Написано 34 полезных сообщений (для 123 пользователей)
|
Ответ: AA-эмуляция в Deferred render
Сообщение от .Squid
Извини, мне Knightmare запрещает помогать юнитоидам.
|
Они чем то хуже остальных?
__________________
Лечим заражение... одна пуля - один больной.
|
(Offline)
|
|
07.12.2010, 15:19
|
#6
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: AA-эмуляция в Deferred render
Сообщение от viper86
Они чем то хуже остальных?
|
Нет, наоборот. Он говорит, что я еще не достиг нужного уровня.
__________________
Последний раз редактировалось .Squid, 07.12.2010 в 17:48.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
07.12.2010, 16:25
|
#7
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: AA-эмуляция в Deferred render
Сообщение от .Squid
Извини, мне Knightmare запрещает помогать юнитоидам.
|
конкурентная борьба во всей красе
|
(Offline)
|
|
07.12.2010, 17:43
|
#8
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
Ответ: AA-эмуляция в Deferred render
Нашел более "вкусный" фильтр, по результату - примерно так же хорошо, как и с большим рендером, зато производительность падает значительно меньше.
Линк на тему на официальном форуме
Применение:
Просто вешаем на главную камеру самым первым Image Effect-ом. Если число включенных Image Effect-ов перед этим скриптом нечетное - не работает О_о.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
|
|
07.12.2010, 17:55
|
#9
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: AA-эмуляция в Deferred render
Такое чувство, что размываются не только границы. Ну это если сильно присматриваться.
UPD. Так и есть. Указано в недостатках в описании исходного алгоритма ( http://www.gamedev.net/community/for...opic_id=580517 ). А вообще полезная ссылка.
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:42.
|