Установить размер Libgdx FrameBuffer в мировых единицах - PullRequest
0 голосов
/ 30 августа 2018

Я бы хотел использовать FrameBuffer и установить его размер в мировых единицах вместо пикселей. Когда я устанавливаю размер FrameBuffer в пикселях, я получаю ожидаемый результат. Но когда я использую другие личные единицы. Результат испорчен.

Вот фрагмент рабочего кода:

public class FBOTestLibGDX implements ApplicationListener {

public static void main(String[] args) {
    LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
    cfg.useGL30 = false;
    cfg.width = 640;
    cfg.height = 480;
    cfg.resizable = false;

    new LwjglApplication(new FBOTestLibGDX(), cfg);
}

Texture atlas;
FrameBuffer fbo;
TextureRegion fboRegion;

Matrix4 projection = new Matrix4();
SpriteBatch batch;
OrthographicCamera cam;

@Override
public void create() {
    atlas = new Texture(Gdx.files.local("src/test/resources/fboData/testTexture.jpg"));

    fbo = new FrameBuffer(Format.RGBA8888, atlas.getWidth(), atlas.getHeight(), false);
    fboRegion = new TextureRegion(fbo.getColorBufferTexture(), atlas.getWidth(), atlas.getHeight());
    fboRegion.flip(false, true); // FBO uses lower left, TextureRegion uses
    projection.setToOrtho2D(0, 0, atlas.getWidth(), atlas.getHeight());

    batch = new SpriteBatch();
    batch.setProjectionMatrix(projection);
    cam = new OrthographicCamera(5, 5);
    cam.setToOrtho(false);

    renderTextureInFBO();
}

protected void renderTextureInFBO() {
    fbo.begin();
    Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.setProjectionMatrix(projection);
    batch.draw(atlas, 0, 0);
    batch.end();
    fbo.end();
}

@Override
public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 0f);
    Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
    batch.setProjectionMatrix(cam.combined);
    batch.begin();
    batch.draw(fboRegion, 0, 0, 5, 5);
    batch.end();
}

@Override
public void resize(int width, int height) {
    cam.setToOrtho(false, 5, 5);
    //batch.setProjectionMatrix(cam.combined);
}

@Override
public void pause() {}

@Override
public void resume() {}

@Override
public void dispose() {}
}

Используя пиксель, я получаю этот результат:

result ok

Но если я использую мировые единицы для FrameBuffer, как это:

public void create() {
    ...
    fbo = new FrameBuffer(Format.RGBA8888, 5, 5, false);
    fboRegion = new TextureRegion(fbo.getColorBufferTexture(), 5, 5);
    fboRegion.flip(false, true);
    projection.setToOrtho2D(0, 0, 5, 5);
    ...
}

protected void renderTextureInFBO() {
    ...
    batch.draw(atlas, 0, 0,5,5);
    ...
}

Я получаю низкомасштабный результат: enter image description here

Вопрос в том, можно ли установить размер FrameBuffer в мировых единицах, как мы это делаем для пакета и окна просмотра, или это обязательно в пикселях?

1 Ответ

0 голосов
/ 02 сентября 2018

Как указано в документации, размер FrameBuffer должен быть определен в пикселях. сравни: Спецификация FrameBuffer

FrameBuffer

публичный FrameBuffer (формат Pixmap.Format, int width, высота, логическое значение hasDepth, логический hasStencil)

Создает новый FrameBuffer с заданными размерами и, возможно, глубиной и прикрепленным буфером трафарета.

Параметры:

format - формат цветового буфера; в соответствии со спецификацией OpenGL ES 2.0, только RGB565, RGBA4444 и RGB5_A1 могут воспроизводиться цветом

width - ширина кадрового буфера в пикселях

высота - высота кадрового буфера в пикселях

hasDepth - подключать ли буфер глубины

Выдает

GdxRuntimeException - в случае, если FrameBuffer не может быть создан

...