Curved World
Если мир бесконечный, встаёт вопрос что делать с линией горизонта.
Скайбокс не нарисуешь, реальную «прогрузку» далеко не сделаешь — это всё ресурсы которых не так много, учитывая что я мечу также в порт на мобильные устройства. Остаётся только добавить туман как в Silent Hill )
И как-то вдруг мне пришла в голову идея сделать эффект «круглой планеты» — загибать игровой мир за линию горизонта. Позже я узнал что оказывается «в народе» этот эффект больше всего ассоциируется с Animal Crossing и это мне позже пригодится.
Первые попытки реализовать этот эффект я принял ещё когда проект был ориентирован на Web-технологии. Да, я пытался собрать прототип на React+Three.js+Colyseus и оно в принципе работало — можно было открыть сайт хоть с телефона, хоть с компа, хоть через встроенный браузер VR-шлема и попасть в игру. Причем даже работал proximity-voice-chat посредством WebRTC. Но сейчас не об этом.
Так как в браузере ресурсов крайне мало, а я тогда был уж совсем не гейм-девелопер чтобы писать кастомные шейдеры — я подошел к решению «в лоб». Так как мир уже разделен на тайлы — мы можем просто эти тайлы смещать по Y-координате пропорционально расстоянию от игрока. И это работало!
Однако, при подъеме на высокие горы вся магия «рассыпалась». Становились видны эти поднимающиеся-опускающиеся «островки» и их резкие квадратные границы.
В целом, в этом тоже был свой шарм и игру можно было продолжать делать именно с этим эффектом.
Проблема крылась в принципе размещения пропов: из-за того что у меня была потребность привязывать каждый проп к родителю-тайлу чтобы двигать его по высоте вместе с ним — я не мог использовать GPU-инстанцирование, так как оно не поддерживает parent-transform, все координаты инстансов нужно передать «как есть».
К этому времени эксперименты с ускорением рендеринга увели меня в сторону собственного шейдера — я перешел на цвета запеченные в вершины, а стандартный Unity/Lit такое не умеет. В собственный шейдер можно было добавить «честный» curved-world — смещать именно вершины через vertex-shader.
Эффект превзошел все мои ожидания! Если раньше было видно как куски уровня на горизонте двигаются ввер-вниз, то теперь весь уровень искривзялся и загибался за горизонт максимально плавно. Деревья и здания «выползали» из-за горизонта давая ощущение исследования круглой планеты.
Следующий челлендж был в том как заставить облака огибать наш круглый мир.
Но перед этим нужно было в принципе как-то сделать интересные динамичный облака )
Об этом в другой раз.
#devblog
Если мир бесконечный, встаёт вопрос что делать с линией горизонта.
Скайбокс не нарисуешь, реальную «прогрузку» далеко не сделаешь — это всё ресурсы которых не так много, учитывая что я мечу также в порт на мобильные устройства. Остаётся только добавить туман как в Silent Hill )
И как-то вдруг мне пришла в голову идея сделать эффект «круглой планеты» — загибать игровой мир за линию горизонта. Позже я узнал что оказывается «в народе» этот эффект больше всего ассоциируется с Animal Crossing и это мне позже пригодится.
Первые попытки реализовать этот эффект я принял ещё когда проект был ориентирован на Web-технологии. Да, я пытался собрать прототип на React+Three.js+Colyseus и оно в принципе работало — можно было открыть сайт хоть с телефона, хоть с компа, хоть через встроенный браузер VR-шлема и попасть в игру. Причем даже работал proximity-voice-chat посредством WebRTC. Но сейчас не об этом.
Так как в браузере ресурсов крайне мало, а я тогда был уж совсем не гейм-девелопер чтобы писать кастомные шейдеры — я подошел к решению «в лоб». Так как мир уже разделен на тайлы — мы можем просто эти тайлы смещать по Y-координате пропорционально расстоянию от игрока. И это работало!
Однако, при подъеме на высокие горы вся магия «рассыпалась». Становились видны эти поднимающиеся-опускающиеся «островки» и их резкие квадратные границы.
В целом, в этом тоже был свой шарм и игру можно было продолжать делать именно с этим эффектом.
Проблема крылась в принципе размещения пропов: из-за того что у меня была потребность привязывать каждый проп к родителю-тайлу чтобы двигать его по высоте вместе с ним — я не мог использовать GPU-инстанцирование, так как оно не поддерживает parent-transform, все координаты инстансов нужно передать «как есть».
К этому времени эксперименты с ускорением рендеринга увели меня в сторону собственного шейдера — я перешел на цвета запеченные в вершины, а стандартный Unity/Lit такое не умеет. В собственный шейдер можно было добавить «честный» curved-world — смещать именно вершины через vertex-shader.
Эффект превзошел все мои ожидания! Если раньше было видно как куски уровня на горизонте двигаются ввер-вниз, то теперь весь уровень искривзялся и загибался за горизонт максимально плавно. Деревья и здания «выползали» из-за горизонта давая ощущение исследования круглой планеты.
Следующий челлендж был в том как заставить облака огибать наш круглый мир.
Но перед этим нужно было в принципе как-то сделать интересные динамичный облака )
Об этом в другой раз.
#devblog
🔥3