【发布时间】:2020-06-11 13:11:45
【问题描述】:
这是我的第一个问题。我试图查看源代码(link) 搜索了stackoverflow并阅读了一些一般解释。但是对于如何正确设置(或理解)它,我没有任何智慧。
我不懂投影矩阵或大部分 GL 术语。 我不知道当您应该更新相机时设置相机 (camera.setToOrtho()) 会发生什么 或何时设置批次的投影矩阵。到目前为止,我对它的唯一使用仅限于下面所示的 draw() 方法中使用的代码。
我有一个基于图块的分层游戏。我想使用 FrameBuffer 将水层绘制到 TextureRegion。所以我以后可以尝试用着色器来操作它。我认为这就是这样做的方法。
(我没有使用任何“Scene2d”或“Tiled”类)
Example of what the layer looks like
我如何绘制图层:
public void draw(OrthographicCamera camera) {
Gdx.gl.glClearColor(0, 0, 0, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA,GL20.GL_ONE_MINUS_SRC_ALPHA); // [1]
BATCH.setProjectionMatrix(camera.combined);
BATCH.begin();
for (int i = 0; i < NUM_LAYERS; i++) {
if (RENDER[i]) {
if (SORT[i]) Collections.sort(LAYERS.get(i));
for (DrwDat dat: LAYERS.get(i)) { // [2]
dat.draw(BATCH);
}
}
}
BATCH.end();
}
1。不知道这是做什么的,但我似乎不需要它。 [2]。 DrwDat 只是一个保存可绘制对象的类。在这种情况下,这些是图块。
好的。因此,在绘制循环中,我放置了一个在绘制水层时要调用的方法。目前 我想绘制应该在屏幕上显示的每个图块,而不是将它们绘制到缓冲区。然后:将缓冲区绘制到屏幕上。
问题:我可以在下面的“renderFBO()”方法中添加什么使其工作?为什么?基本上在不使用 FrameBuffer 的情况下让屏幕准确显示它会显示的内容
(当前的代码纯粹是绝望,因为我试图使用 youtube 教程作为模板而不理解它。)
private void renderFBO(OrthographicCamera camera, int layer) {
BATCH.end();
frameBuffer.begin();
Gdx.gl.glClearColor(0, 0, 0, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
BATCH.begin();
camera.setToOrtho(false);
camera.position.set(FocusPoint.position.x,FocusPoint.position.y,0); // [3]
camera.update();
BATCH.setProjectionMatrix(camera.combined);
for (DrwDat dat: LAYERS.get(layer)) {
dat.draw(BATCH);
}
frameBuffer.end(); // [4]
BATCH.end();
camera.setToOrtho(false);
//BATCH.setProjectionMatrix(camera.combined);
BATCH.begin();
BATCH.draw(bufferTexture.getTexture(),0,0,Settings.SCREEN_W,Settings.SCREEN_H);
BATCH.end();
camera.position.set(FocusPoint.position.x,FocusPoint.position.y,0);
camera.update();
BATCH.setProjectionMatrix(camera.combined);
BATCH.begin();
}
[3]。 FocusPoint 只是相机跟随的一个点(例如:鼠标点击位置)
[4]。出于某种原因,将 framebuffer.end() 设置在 batch.end() 下面不会渲染任何内容。
这是我初始化 FrameBuffer 的方法:
private FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888,Settings.SCREEN_W,Settings.SCREEN_H,false);
private TextureRegion bufferTexture = new TextureRegion(frameBuffer.getColorBufferTexture());
如果这太笼统了,我很抱歉。但任何帮助表示赞赏。我能读到的任何提示也会 很有帮助。
【问题讨论】:
标签: libgdx framebuffer