SerafimArts
@SerafimArts
Senior Notepad Reader

Как исправить «пиксельное» движение камеры в libgdx?

Используется стандартная ортографическая камера (OrthographicCamera). При изменении позиции на float - позиция меняется на int (т.е. координата округляется). В результате изображение сдвигается "попиксельно". Есть ли возможность рисовать результат не "pixel perfect"?
Нагуглил вроде бы похожие проблемы - варианты с использованием vector3.scl() и vector3.lerp(), но толь у меня руки кривые, то ли проблемы не совсем те, то ли версия libgdx отличается.

На примере, рассмотрим 3 кадра с движением камеры +.5f по горизонтали (координата x):
Кадр 1: Ничего не происходит
Кадр 2: Сдвиг на один пиксель влево
Кадр 3: Ничего не меняется

Ожидание:
Кадр 1: Сдвиг на 0.5 влево
Кадр 2: Сдвиг на 0.5 влево
Кадр 3: Сдвиг на 0.5 влево

При этом применение интерполяции к текстуре (setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.MipMapLinearLinear)) ожидаемого результата не принесло. Из чего я делаю вывод, что проблема конкретно в камере.

Побочный эффект:
При использовании viewport масштабирование игнорирует интерполяцию: 31a0978cf4ea4d39abeaa4ee87c55f05.jpg

Окружение:
- Libgdx 1.5.6.
- JDK 1.8 x64
- Intel HD Graphics 4600 (т.е. поддержка OpenGL до 4.3).
- Win 7 (в том числе LwjglApplication)

Сам код вполне очевидный:
// camera == OrthographicCamera
// sprite == Sprite
// batch == SpriteBatch
    @Override
    public void render() {
        camera.update();
        camera.position.set(new Vector3(camera.position.x + 0.1f, camera.position.y, 0));

        batch.setProjectionMatrix(camera.combined);
        batch.setTransformMatrix(camera.view);

        // render

        Gdx.gl.glClearColor(0, 0, 0.2f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.begin();
        sprite.draw(batch); // Отрисовка белой картиночки с синими линиями
        batch.end();
    }


Ранее никогда не работал с OpenGL (в том числе с его подводными камнями), более плотно, нежели "просто нарисовать треугольничек".
  • Вопрос задан
  • 1374 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы