Чем ограничивается область рендеринга в игре?

Программирование на Юнити.

Чем ограничивается область рендеринга в игре?

Сообщение Albeoris 03 июл 2017, 00:16

Привет, друзья. Подскажите, пожалуйста, чем в игре может быть ограничена область рендеринга?
Пытаюсь добавить в игру поддержку разрешения 16:9. Во времена когда я последний раз работал с графикой, это происходило при помощи задания области просмотра (Viewport). Но как происходит работа на стыке Camera/GL в Unity я не знаю.

pixelWidth / pixelHeight возвращает огрызок в 1028x720 вместо 1280x720
Изменив аспект камеры с 1.428571 на 2.2 я получаю следующую картину:
Изображение


Меши и текстуры сжимаются по ширине, словно я не увеличил, а уменьшил горизонтальную область просмотра. При этом дождь, рендерящийся посредством GC, продолжает идти на прежней территории (белая полоска справа), но точно так же обрезается по старой границе. Где и что может его ограничивать? Это могут быть шейдеры? Если да, если возможность их декомпилировать? Или нужно смотреть в сторону матриц?

Вот список всех GL-методов, которые вызываются из C#-части:
Синтаксис:
Используется csharp
GL.Begin
GL.Clear
GL.Color
GL.End
GL.IssuePluginEvent
GL.LoadIdentity
GL.LoadOrtho
GL.LoadPixelMatrix
GL.LoadProjectionMatrix
GL.MultMatrix
GL.PopMatrix
GL.PushMatrix
GL.TexCoord2
GL.Vertex3
GL.Viewport


Естественно, Viewport был проверен первым делом и заменен повсеместно на:
Синтаксис:
Используется csharp
GL.Viewport(new Rect(0, 0f, Screen.width, Screen.height));
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

Re: Чем ограничивается область рендеринга в игре?

Сообщение jetyb 03 июл 2017, 08:14

Область рендеринга ограничивается фруструмом камеры
https://docs.unity3d.com/Manual/Underst ... ustum.html
Все объекты, попадающие в него, рендерятся, остальные - нет.
Сам классу GL на этот фруструм плевать, он будет обрабатывать все что ему скармливают, проверка отсечения лежит на совести программиста.
Ему важна только проекционная матрица камеры, которую и можно задавать в методах GL.

Изменив аспект камеры с 1.428571 на 2.2 я получаю следующую картину:
Меши и текстуры сжимаются по ширине, словно я не увеличил, а уменьшил горизонтальную область просмотра.

1. Менять аспект камеры напрямую - плохой ход, это приведет ко всяческим искажениям. Вообще долгое время свойство aspect было get only.
Лучше всего менять Camera.pixelRect , а аспект перерассчитается сам.
2. Вы увеличили аспект =>
горизонтальная область обзора увеличилась =>
на 1 пиксель экрана стало приходиться больше горизонтального пространства =>
"все сжалось" по ширине.
Все верно.

При этом дождь, рендерящийся посредством GC, продолжает идти на прежней территории (белая полоска справа), но точно так же обрезается по старой границе.

Какого еще GC? В любом случае, это уже вам виднее, как там дождь устроен.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Чем ограничивается область рендеринга в игре?

Сообщение Albeoris 03 июл 2017, 09:47

Спасибо, попробую. Хотя как-то я уже пытался менять pixelRect и эффекта было 0. После его изменения нужно вызывать какой-нибудь метод для обновления камеры?

P.S. GL, а не GC, конечно. :)
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

Re: Чем ограничивается область рендеринга в игре?

Сообщение snezhok_13 03 июл 2017, 11:15

ViewPort это как раз нормализованное задание области, которую будет занимать изображение с камеры на экране.
Без искажений получить другой аспект по идее нужно получать изменением FoV, угла обзора камеры
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Чем ограничивается область рендеринга в игре?

Сообщение jetyb 03 июл 2017, 11:50

Дождь через класс GL?? Вы что, так каждую каплю рисуете?
Я тоже как-то такое делал, только не на unity а в ManagedDirectX спрайтами, когда других возможностей там не знал...

Базовая ParticleSystem в unity эффективнее, поскольку там каждая частица двигается через GPU, да и возможностей настройки побольше.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Чем ограничивается область рендеринга в игре?

Сообщение Albeoris 03 июл 2017, 23:12

snezhok_13 писал(а):ViewPort это как раз нормализованное задание области, которую будет занимать изображение с камеры на экране.
Без искажений получить другой аспект по идее нужно получать изменением FoV, угла обзора камеры

В описании FoV сказано: This is the vertical field of view; horizontal FOV varies depending on the viewport's aspect ratio. Field of view is ignored when camera is orthographic (see orthographic).
По вертикали у меня как раз всё нормально, проблема с горизонтальным масштабированием. Кроме того, камера как раз с ортографической проекцией. Но при изменении orthographicSize я поулчаю следующую картину:

1. Увеличиваю в 2 раза (112 -> 224):
Изображение

2. Уменьшаю в 2 раза (112 -> 56)
Изображение

То бишь изображение масштабируется, но при этом аспект сохраняется неизменным, что логично, ведь и то и другое значение отвечают за вертикальную область просмотра.

jetyb писал(а):Дождь через класс GL?? Вы что, так каждую каплю рисуете?
Я тоже как-то такое делал, только не на unity а в ManagedDirectX спрайтами, когда других возможностей там не знал...

Базовая ParticleSystem в unity эффективнее, поскольку там каждая частица двигается через GPU, да и возможностей настройки побольше.

Это не я, это разработчики порта игры с PS1. Я лишь пытаюсь привести её в человеческий вид.

Так или иначе, мне удалось решить проблему (в первом приближении). Благодаря вашим подсказкам я знал, что искать и смог найти все места, где выполнялось масштабирование изображения, за что вам огромное спасибо! Мне ещё придётся изрядно повозиться с тем, чтобы все сцены игры корректно отображались при произвольном разрешении, но начало положено. Огромное спасибо за подсказки, иначе я бы ещё долго мучился.

Итого:
1) pixelRect - его постоянно обновляли сразу два фоновых компонента
2) RenderTarget - в некоторых местах создавалась текстура с подогнанными под аспект размерами
3) localScale - масштаб корневого элемента сцены задавался с учётом аспекта для того чтобы вписать изображение по высоте

После устранения всех этих проблем, изображение стало корректно рендериться на всю область экрана, чему я несказанно рад:
https://i.imgur.com/oOXHDRE.jpg
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 10