Используется стандартная ортографическая камера (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 масштабирование игнорирует интерполяцию:
Окружение:
- 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 (в том числе с его подводными камнями), более плотно, нежели "просто нарисовать треугольничек".