Изменить начальный цвет фона в libgdx без glClearColor?

#java #background #libgdx

#java #фон #libgdx

Вопрос:

возможно ли изменить цвет фона по умолчанию в libgdx. я хочу изменить цвет фона с черного на любой желаемый цвет, а не очистить экран. я использую ShapeRenderer для создания заполненного прямоугольника. затем я перемещаю этот прямоугольник по экрану, и я хочу сохранить ранее отображенный прямоугольник.

использование Gdx.gl.glClearColor() и Gdx.gl.glClear(), очевидно, повторно отображает цвет фона поверх предыдущего, очищая ранее отображенный прямоугольник.

если я не использую Gdx.gl.glClearColor() и Gdx.gl.glClear(), фон будет черным, а рендеринг и перемещение прямоугольника — это то, что я хочу, кроме того факта, что цвет фона по умолчанию черный. ведьма — это не тот вид, который мне нужен.

Комментарии:

1. Сначала визуализируйте прямоугольник, заполненный желаемым цветом и размером экрана? Визуализировать в растровое изображение, а затем использовать очистить и нарисовать растровое изображение?

2. Завершите свой Gdx.gl.glClear() вызов соответствующим оператором if.

3. возможно, я думаю по-другому, тогда вы, Десятичетырехлетний, не могли бы вы уточнить. как будто я использую оператор «if», чтобы ограничить, когда и как вызывается Gdx.gl.glClear(). если бы я хотел иметь белый фон Gdx.gl.glClearColor(1,1,1,1) и чтобы Gdx.gl.glClear() был ограничен оператором if, я не буду иметь никакого эффекта от Gdx.gl.glClearColor(1,1,1,1).

4. О, я совершенно неправильно понял ваш вопрос, извините.

5. Я думаю, что может быть некоторое недопонимание того, что вы хотите. Если я вас правильно понял, вы просто хотите установить цвет экрана, а затем рисовать прямоугольники каждый цикл рендеринга без очистки экрана. Это не означает, что в первом цикле рендеринга вы не можете, и я думаю, что вы должны, очистить экран любым цветом, который вы хотите. Затем, как предлагает Tenfour04, просто используйте оператор if, чтобы проверить, является ли это вашим первым циклом рендеринга, если нет, не очищайте экран (это все равно оставит ваш цвет фона, пока вы не нарисуете его). Если мы все еще не помогли, пожалуйста, сообщите более подробную информацию.

Ответ №1:

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

Что могло бы быть проще, так это использовать отдельный буфер кадров для всего содержимого вашей сцены и нарисовать его поверх фона. Для этого потребуется буфер кадров с альфа-компонентом, и вам нужно будет использовать blendFuncSeparate его при рендеринге, чтобы альфа сохранялась в этом буфере кадров, чтобы ее можно было рисовать поверх фона. Вы бы использовали прозрачный прозрачный цвет в буфере кадров и любой цвет, который вы хотите, в основном буфере кадров.

Фреймбуферы libGDX — это большая тема, и здесь слишком много объяснений. Вы должны начать с документации, и если вы начнете ее внедрять и у вас возникнут проблемы, вы можете создать новый вопрос.

Комментарии:

1. да, полностью ваш первый абзац — это то, что, как я думал, мне нужно будет сделать, но это казалось большой обработкой, чтобы сохранить предыдущее состояние и перерисовывать его каждый раз. time.im не знаком с созданием отдельного буфера и использованием blendFuncSeparate, но то, что вы объясняете, кажется гораздо более эффективным способом. в непрофессионале в основном мы распределяем различные рендеры. Спасибо, это здорово, просто нужно было, чтобы кто-то показал мне дверь.

2. Разница в эффективности между двумя способами зависит от того, какова ваша сцена. Если у вас очень длинная история событий, которые влияют на окончательный вид сцены, то, возможно, второй способ лучше. Имейте в виду, что подавляющее большинство игр перерисовывают абсолютно все в каждом кадре, чтобы его можно было анимировать, поэтому в большинстве случаев все можно перерисовать. Кроме того, я забыл упомянуть, что существует потенциальная проблема потери контекста OpenGL, из-за которой вы теряете содержимое вашего буфера кадров (либо того, что на экране, либо вторичного, который вы создаете, если используете второй метод, описанный выше).

3. Контекст OpenGL потенциально может быть потерян на Android, если игра будет переведена в фоновый режим, а затем вернется. LibGDX автоматически перезагружает все текстуры (созданные из файлов изображений), шейдеры и сетки, когда это происходит, но он не перезагружает содержимое буфера кадров автоматически, поскольку у него нет никакого способа получить данные. Если воспроизведение чертежа всей вашей сцены невозможно, вам, возможно, потребуется скопировать содержимое буфера кадров в Pixmap pause() и восстановить их в FrameBuffer resume() .

4. Я сам этого не делал, поэтому не уверен на 100% pause , что это произойдет до потенциальной потери контекста.