Неожиданные результаты, реализующие простое размытие движения в Libgdx
В двух прикрепленных изображениях снимок экрана на рабочем столе libgdx функционирует так, как ожидалось. Скриншот от моей Galaxy Nexus, к сожалению, не так. Я пытаюсь создать простой эффект размытия движения или след.
Рендеринг, как я ожидал, на своем рабочем столе.
![Libgdx running on my desktop, working as expected]()
Не было рендеринга, как я ожидал от своей галактической связи.
![Libgdx running on my Galaxy Nexus not working as expected]()
Тексты окружности рисуются в цикле for во время рендеринга, и эффект достигается с помощью pixmap с использованием RGBA 0, 0, 0, 0,1f, который рисуется перед кругами.
создание screenClearSprite
Pixmap screenClearPixmap = new Pixmap(256, 256, Format.RGBA8888);
screenClearPixmap.setColor(Color.rgba8888(0, 0, 0, 0.1f));
screenClearPixmap.fillRectangle(0, 0, 256, 256);
screenClearTexture = new Texture(screenClearPixmap);
screenClearSprite = new Sprite(screenClearTexture);
screenClearSprite.setSize(screenWidth, screenHeight);
screenClearPixmap.dispose();
Render
batch.begin();
font.draw(batch, "fps:" + Gdx.graphics.getFramesPerSecond(), 0, 20);
screenClearSprite.draw(batch);
for (int i = 0; i < circleBodies.size(); i++) {
tempPos = circleBodies.get(i).getPosition();
batch.draw(circleTexture, (tempPos.x * SCALE) + screenWidthHalf
- circleSizeHalf, (tempPos.y * SCALE) + screenHeightHalf
- circleSizeHalf);
}
batch.end();
Итак, что я сделал неправильно? Возможно, есть лучший способ получить эффект движения "motion blur"?
Ответы
Ответ 1
Вот другой подход, когда вы каждый раз очищаете свой экран сплошным цветом и без альфы.
Это означает, что вам придется немного изменить код. Хорошая вещь об этом заключается в том, что способ, которым вы это делаете, имеет некоторые недостатки: он будет размывать все в движении, а не только шары. И может быстро создавать уродливые результаты/артефакты, если вы не будете осторожны.
-
Сделайте то же, что и сейчас, но вместо того, чтобы рисовать шары в пакет, нарисуйте их на текстуре/растровое изображение/что угодно. Затем каждый кадр добавляет альфа-смешанное изображение по шариковому изображению, а затем рисует шары в их текущем положении поверх этого. Затем добавьте это изображение на свой экран. Очень похоже на то, что вы делаете сейчас, за исключением того, что вы рисуете что-то еще и сохраняете его. Таким образом, вам не нужно полагаться на видовое окно, на которое вы рисуете, и можете держать все в стороне.
Этот метод похож на рисование в буфер накопления.
-
Вместо того, чтобы делать это так, как вы делаете, вы можете отслеживать n последних позиций каждого шара. И затем нарисуйте все из них каждый кадр, с разными альфа. Это очень легко реализовать. Может привести к многочисленным вызовам рисования, если у вас много шаров или большой n, но если он не слишком много, он не должен ограничивать ваши fps и дает хороший контроль.
Ответ 2
Возможно, есть лучший способ получить эффект "motion blur" движение?
чтобы сделать размытие движения в моей игре, я использую другой подход " Эффект частиц", он отлично работает со мной, и у меня не было проблем с Android/Desktop или с различными устройствами Android
все, что вам нужно сделать, это использовать "Редактор эффектов частиц" Libgdx и сделать свой эффект, а затем загрузить его в свой проект, наконец, нарисовать его в том же месте, в котором вы нарисовываете свой объект (и алос рисует ваш объект).
Советы по созданию файла правого эффекта с помощью редактора Paticle:
-
установить (использовать) тот же образ объекта, который вы хотите размыть его движением в эффекте частицы
-
попытайтесь ограничить count: максимальное количество разрешенных частиц
-
Отключите "скорость" и "угол",
Параметр
Эффект частиц помогает сделать эффект движения
Надеюсь, это поможет кому-то!