Страница 1 из 1

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

СообщениеДобавлено: 03 июл 2017, 00:16
Albeoris
Привет, друзья. Подскажите, пожалуйста, чем в игре может быть ограничена область рендеринга?
Пытаюсь добавить в игру поддержку разрешения 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));

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

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

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

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

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

Какого еще GC? В любом случае, это уже вам виднее, как там дождь устроен.

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

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

P.S. GL, а не GC, конечно. :)

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

СообщениеДобавлено: 03 июл 2017, 11:15
snezhok_13
ViewPort это как раз нормализованное задание области, которую будет занимать изображение с камеры на экране.
Без искажений получить другой аспект по идее нужно получать изменением FoV, угла обзора камеры

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

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

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

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

СообщениеДобавлено: 03 июл 2017, 23:12
Albeoris
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