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

Ну и конечно же было бы очень круто если бы вы пошарили систему освещения, но это уже я думаю мечты :)
Затем, когда все тени занесены в 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.mail.ru
Численность
5 001–10 000 человек
Дата регистрации

Блог на Хабре