Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 07.12.2010, 01:54   #1
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 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.
По этому же принципу возможны другие реализации, и скорее всего моя - не самая быстрая. Но она работает.
Миниатюры
Нажмите на изображение для увеличения
Название: AA_emulation.png
Просмотров: 1281
Размер:	132.7 Кб
ID:	12046  
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.

Последний раз редактировалось Taugeshtu, 07.12.2010 в 02:36. Причина: Орфография))
(Offline)
 
Ответить с цитированием
Эти 6 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
baton4ik (08.12.2010), BlackOut (07.12.2010), Nuprahtor (07.12.2010), pax (07.12.2010), Slayer (07.12.2010), St_AnGer (07.12.2010)
Старый 07.12.2010, 02:11   #2
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: AA-эмуляция в Deffered render

Я отношусь к той группе, которая сочетание этих слов видит впервые.

И таки ты прав: такой способ далеко не самый быстрый. Гораздо быстрее (хотя и менее качественно, но разницу только профессионалы, пожалуй, заметят) размывать бекбуфер по маске, полученной с помощью edge detection. Например, как тут http://orenk2k.blogspot.com/2010/10/...-aliasing.html

ЗЫ. deferred. Ну и правильнее все же Deferred Shading, а не Rendering, т.к. отложено именно освещение, а не рендеринг. Хотя сейчас говорят и так, и эдак, так что пофиг.
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
BlackOut (07.12.2010), Taugeshtu (07.12.2010)
Старый 07.12.2010, 02:26   #3
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Вопрос Ответ: AA-эмуляция в Deferred render

размывать бекбуфер по маске
Строго говоря, Edge Blur этим и занимается - детектирует грани и моет что нашел. Но то ли он это сильно неумело делает, то ли у меня глаз такой острый - мне очень неприятно наблюдать ДИКОЕ заблюривание заднего плана. Как правило чем дальше - тем больше граней на квадратный пиксель, и задний план превращается в кашу. В аттаче - иллюстрация.

Есть предположения, как это побороть?
Миниатюры
Нажмите на изображение для увеличения
Название: blur.png
Просмотров: 1216
Размер:	212.4 Кб
ID:	12047  
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Старый 07.12.2010, 11:23   #4
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: AA-эмуляция в Deferred render

Извини, мне Knightmare запрещает помогать юнитоидам.
__________________


Последний раз редактировалось .Squid, 07.12.2010 в 17:48.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
BlackOut (07.12.2010), Harter (07.12.2010), Hurrit (08.12.2010), pax (07.12.2010), Randomize (08.12.2010)
Старый 07.12.2010, 14:15   #5
viper86
Нуждающийся
 
Аватар для viper86
 
Регистрация: 19.11.2008
Адрес: Украина, Луганск
Сообщений: 72
Написано 34 полезных сообщений
(для 123 пользователей)
Ответ: AA-эмуляция в Deferred render

Сообщение от .Squid Посмотреть сообщение
Извини, мне Knightmare запрещает помогать юнитоидам.
Они чем то хуже остальных?
__________________
Лечим заражение... одна пуля - один больной.
(Offline)
 
Ответить с цитированием
Старый 07.12.2010, 15:19   #6
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: AA-эмуляция в Deferred render

Сообщение от viper86 Посмотреть сообщение
Они чем то хуже остальных?
Нет, наоборот. Он говорит, что я еще не достиг нужного уровня.
__________________


Последний раз редактировалось .Squid, 07.12.2010 в 17:48.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
BlackOut (07.12.2010), Harter (07.12.2010), Hurrit (08.12.2010), Randomize (08.12.2010), Reks888 (07.12.2010)
Старый 07.12.2010, 16:25   #7
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений
(для 1,460 пользователей)
Ответ: AA-эмуляция в Deferred render

Сообщение от .Squid Посмотреть сообщение
Извини, мне Knightmare запрещает помогать юнитоидам.
конкурентная борьба во всей красе
(Offline)
 
Ответить с цитированием
Старый 07.12.2010, 17:43   #8
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 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 за это полезное сообщение:
.Squid (07.12.2010), pax (07.12.2010)
Старый 07.12.2010, 17:55   #9
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: AA-эмуляция в Deferred render

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

UPD. Так и есть. Указано в недостатках в описании исходного алгоритма ( http://www.gamedev.net/community/for...opic_id=580517 ). А вообще полезная ссылка.
__________________

(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 07:45.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com