Неожиданные результаты, реализующие простое размытие движения в 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: максимальное количество разрешенных частиц

  • Отключите "скорость" и "угол", Параметр

Эффект частиц помогает сделать эффект движения Надеюсь, это поможет кому-то!