Godot 4.5. Грустная история портировщика.
Плохие новости: разработчики Godot опять изменили код, отвечающий за финальный рендеринг кадра.
Хорошие новости: Новый подход близок к тому, что я делал при портировании Godot 4.4 на ОС Аврора. Это так же предотвратит гарантированный баг, который будет заметен в моем порте Godot 4 в будущей ОС Аврора 5.2 при переносе окна игры на внешний экран. Поясню подробнее.
Как обстояли дела в Godot 4.4
Перед началом рендеринга финального кадра вызывается функция glViewport. Она сообщает драйверу, какой участок буфера будет использоваться для вывода изображения. В Godot 4.4 размер этого участка не соответствовал фактическому размеру окна, а задавался заведомо бо́льшим. (Причины расписывать долго, так было нужно)
Для моего порта под ОС Аврора это было крайне неудобно. Я использовал
полноэкранный квад (quad), который занимал весь viewport, и поворачивал
его с помощью матрицы, чтобы адаптировать рендер под ориентацию экрана устройства. Из-за этого мне приходилось использовать в потоке рендеринга (render thread) реальные размеры дисплея, а не окна приложения. Это, по своей сути, неверный подход, но он позволил быстро реализовать нужную функциональность без усложнения логики. Моё решение гарантированно ломало бы вывод на внешний монитор, но на тот момент работа с несколькими экранами в ОС Аврора была ещё на ранней стадии разработки.
Для моего порта под ОС Аврора это было крайне неудобно. Я использовал
полноэкранный квад (quad), который занимал весь viewport, и поворачивал
его с помощью матрицы, чтобы адаптировать рендер под ориентацию экрана устройства. Из-за этого мне приходилось использовать в потоке рендеринга (render thread) реальные размеры дисплея, а не окна приложения. Это, по своей сути, неверный подход, но он позволил быстро реализовать нужную функциональность без усложнения логики. Моё решение гарантированно ломало бы вывод на внешний монитор, но на тот момент работа с несколькими экранами в ОС Аврора была ещё на ранней стадии разработки.
Кроме того, движок использовал функцию glBlitFrameBuffer для копирования пикселей из буфера на экран. Этот метод мне тоже не
подходил, так как не позволял учесть поворот. Поэтому я заменил его на
рендеринг того самого квада с наложенной текстурой, в качестве которой и
выступал отрендеренный кадр.
подходил, так как не позволял учесть поворот. Поэтому я заменил его на
рендеринг того самого квада с наложенной текстурой, в качестве которой и
выступал отрендеренный кадр.
Что изменилось в Godot 4.5
Теперь всё стало гораздо логичнее:
- Рендеринг финального кадра теперь тоже выполняется через квад, а не через glBlitFrameBuffer
Что в итоге?
Хотя новый подход и является более удобным для меня, код рендеринга довольно сильно изменился. Это значит, что половину моих доработок придётся либо выбросить, либо серьёзно переписать. Процесс будет небыстрым, поскольку я занимаюсь этим в свободное время и, по большому счёту, на чистом энтузиазме (бесплатно 😅).
godot
auroraos
душно
gles
lifeteo
главное не бросай сие дело. чем сможем поможем.
Nov 13 2025 16:39 

1
