Обновить

Комментарии 15

А при каком количестве полигонов на сцене у вас получилось 30 FPS на iPad 2 с учетом примененных выше технологий?

Ну и конечно же было бы очень круто если бы вы пошарили систему освещения, но это уже я думаю мечты :)
60k-80k полигонов
100-130 draw calls
А анти-алиасинг на Unity/iPAD2 пока недоступен?
Доступен. Но Эволюция работает без него.
Затем, когда все тени занесены в stencil buffer, мы делаем финальный проход рендеринга, на котором заливаем весь экран нужным цветом, с учетом stencil-маски. Получаем корректные динамические тени, которые никак (!) не влияют на FPS.

Как-то вразжопицу получается. Не ясно для чего нужна была полноэкранная заливка, если можно сразу писать в кадр и стенсил с тестом на чистоту этого самого стенсила? Никаких заливок экрана и не понадобилось бы. А то, что полноэкранный квад никак не повлиял на филлрейт, может говорить лишь о том, что упираетесь в CPU или vertex processing. Хотя кто знает во что там эта ваша юнити упирается… ;)
Полноэкранная заливка, в первую очередь, нужна для избежания блендинга нескольких слоев полигонов (как на скрине в статье).
Вы предлагаете одновременно на одном проходе и читать и писать в стенсил-буфер? Разве такое возможно? А если перерисовывать тень дважды, то у нас будет не 60-80k полигонов, а 100-120k.
К тому же это не спасет от блендинга пересекающихся полигонов. Полноэкранный квад не влияет на филлрейт, потому что большая часть квада отсекается стенсил-маской еще до выполнения пиксельного шейдера и блендинга соответственно.
они за вас копируют back buffer в отдельную текстуру и отдают вам ее на обработку.

Как такое вообще можно реализовать средствами OpenGL ES 2.0 на iPad2? Наверное, можно было бы использовать glBlitFramebuffer, но эта функция доступна только в OpenGL ES 3.0.
Возможно я ошибаюсь, и можно присоединить render buffer к back buffer, к которому в свою очередь присоединена текстура. Я так никогда не делал и никогда не видел подобных решений. Думаю, что это вряд ли возможно, т.к. back buffer это все таки не frame buffer, хотя я и не уверен в случае с ios. Если это все же возможно, что должно произойти после swap'а front и back буфера?
По моему личному мнению, было бы очень странно, если в Unity действительно перед пост процессингом, содержимое из back буфера копировалось в текстуру.
Дело в том, что в free-версии Unity RenderTexture вообще недоступна и пост-процесс соответственно невозможен. Движок просто все рисует в backbuffer.
В pro-версии RenderTexture можно создавать самим, но движок-то остается одним и тем же. Соответственно он будет рисовать в backbuffer, пока мы не укажем явно RenderTexture для камеры. А если мы вообще не укажем RenderTexture, то при пост-процессе в методе OnRenderImage будет создана RenderTexture, в которую будет скопировано содержимое back buffer.
Как прочитать backbuffer в текстуру на OpenGL ES 2.0 я не в курсе. Как это делает движок тоже не знаю. В любом случае, даже если это не backbuffer, а какой-то внутренний буфер движка, он все равно будет скопирован в новую RenderTexture, что тоже медленно, особенно если retina-разрешение на каком-нибудь iPad3.
По поводу планарных теней — как решили вопрос с отсечением теней? Если просто добавить материал к MeshRenderer/SkinnedMeshRenderer, то bounding box тени не будет соответствовать bounding box'у модели, в результате чего тень будет постоянно исчезать и появляться из ниоткуда, так как отсечение понятия не имеет о том, что вы как-то там в шейдере вершины сдвинули. Сейчас как раз просто тоже занимаюсь реализацией планарных теней, и это просто-таки какая-то нерешаемая адекватно проблема.
Хороший вопрос :)
У нас каждый персонаж рисуется нашим кастомным шейдером, у которого есть тэг «ShadowCaster».
Мы создали отдельную камеру для теней и задали ей replacement shader с таким же тэгом. Этот шейдер рисует те же самые модели с теми же bounding box'ами, только плющит их нашей матрицей тени.
Ну вот я про это и говорю, что bounding box не меняется. Грубо говоря, если сделать тень достаточно длинной, и расположить камеру так, чтобы в поле зрения камеры не попадала сама модель, но попадала тень — то не будет отрисована ни модель (что логично), ни её тень (что плохо).
Этим страдают практически все техники отрисовки теней. Мы просто оставили все как есть, у нас не видны эти «щелчки» тени.
Unity не дает возможность управлять BoundingBox'ом или системой отсечения, нельзя зафорсить отрисовку объекта, если он невидим камерой, это правда.
Если бы у меня стояла такая задача, я бы попробовал сделать следующее:
— для камеры, которая рисует тени задать фрустум и позицию так, чтобы она видела все объекты, отбрасывающие тень.
— в шейдере отрисовки тени заменить матрицу вида и проекции теневой камеры на матрицы вида и проекции основной камеры.
Что нельзя задать bounding box'ом в Unity — это да, досадно, учитывая, что посчитать-то его для тени проще простого =/
Но мысль про замену матриц интересная. Спасибо, попробую :)
Ответьте, пожалуйста, на вопрос из предыдущего поста про балансировку! Я всё ещё помню и жду!
Про балансировку поступил ряд вопросов, и мы напишем отдельный пост про это. Следите за обновлениями!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
team.vk.company
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия
Представитель
Дмитрий Головин