Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以世界单位设置Libgdx帧缓冲区大小_Java_Opengl_Libgdx_Framebuffer - Fatal编程技术网

Java 以世界单位设置Libgdx帧缓冲区大小

Java 以世界单位设置Libgdx帧缓冲区大小,java,opengl,libgdx,framebuffer,Java,Opengl,Libgdx,Framebuffer,我喜欢使用帧缓冲区,用世界单位而不是像素来设置他的大小。 当我以像素为单位设置帧缓冲区大小时,我得到了预期的结果。但当我使用另一个个人单位时。结果搞砸了 下面是一段工作代码: public class FBOTestLibGDX implements ApplicationListener { public static void main(String[] args) { LwjglApplicationConfiguration cfg = new LwjglApplication

我喜欢使用帧缓冲区,用世界单位而不是像素来设置他的大小。 当我以像素为单位设置帧缓冲区大小时,我得到了预期的结果。但当我使用另一个个人单位时。结果搞砸了

下面是一段工作代码:

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() {}
}
使用像素I可获得以下结果:

但如果我对帧缓冲区使用世界单位,如下所示:

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);
    ...
}
我得到了一个小规模的结果:


问题是,可以像批处理和视口一样以世界单位设置帧缓冲区大小,或者必须以像素为单位设置帧缓冲区大小?

如文档中所述,帧缓冲区大小必须以像素为单位定义。囊性纤维变性:

帧缓冲区

公共帧缓冲区(Pixmap.Format, 整数宽度, 整数高度, 布尔深度, 布尔hassencil)

创建一个新的帧缓冲区,该帧缓冲区具有给定的尺寸和可能的深度,并附加一个模具缓冲区

参数:

格式-颜色缓冲区的格式;根据OpenGL ES 2.0规范,只有RGB565、RGBA4444和RGB5_A1可以进行颜色渲染

宽度-帧缓冲区的宽度(以像素为单位)

高度-帧缓冲区的高度(以像素为单位)

hasDepth-是否附加深度缓冲区

投掷

GdxRuntimeException-如果无法创建帧缓冲区


我不太了解libgdx,但是用像素以外的东西定义帧缓冲区大小没有多大意义。帧缓冲区基本上是可以渲染到其中的纹理。纹理大小与世界单位没有任何关系。我之所以这样做,是因为我想绘制瓷砖,并将效果和混合应用到帧缓冲区中。因此,我想以世界单位定义帧缓冲区,以使纹理的大小与直接在批中绘制瓷砖的纹理大小相同。这样我就不必处理像素,而且更容易适应不同的屏幕分辨率。@NyouB只需将瓷砖坐标转换为像素。我正在寻找一种不必这样做的方法。并知道帧缓冲区是否指定其大小以像素为单位。帧缓冲区只能以像素为单位定义。