java - 以世界单位设置 Libgdx FrameBuffer 大小
问题描述
我想使用 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() {}
}
使用像素我得到这个结果:
但是,如果我像这样使用 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);
...
}
问题是,是否可以像我们对批处理和视口所做的那样以世界单位设置 FrameBuffer 大小,还是必须以像素为单位进行设置?
解决方案
如文档中所述,必须以像素为单位定义 FrameBuffer 大小。cf: 帧缓冲区规范
帧缓冲区
公共 FrameBuffer(Pixmap.Format 格式, int width, int height, boolean hasDepth, boolean hasStencil)
创建一个具有给定尺寸的新 FrameBuffer,并可能附加一个深度和一个模板缓冲区。
参数:
format - 颜色缓冲区的格式;根据 OpenGL ES 2.0 规范,只有 RGB565、RGBA4444 和 RGB5_A1 是可渲染颜色的
width - 帧缓冲区的宽度(以像素为单位)
height - 帧缓冲区的高度(以像素为单位)
hasDepth - 是否附加深度缓冲区
投掷
GdxRuntimeException - 如果无法创建 FrameBuffer
推荐阅读
- compilation - 引用并将 BibTeX 编译成单独的文档
- python - 如何在 Ansible 的 pip 命令中排除逗号
- opengl - 在新参考系中表达旋转矩阵
- postgresql - 查询语言 (SQL) 函数中的通用执行计划
- c - setbuf 只影响stdio调用,不影响系统调用?
- javascript - 在 React Native 中迭代 for 循环时,如何在状态对象中添加键值对?
- vba - Word 宏:如何在表格排序中排除总行并摆脱错误 5992
- azure-cognitive-search - Azure 搜索在邻近搜索中返回额外的命中亮点
- python - 如何在噪声中添加非零元素?
- javascript - 如何从期权中获得价值?