В конце функции рендеринга я рисую в FrameBuffer и удаляю некоторые части конечного изображения, которые не следует отображать с помощью растрового изображения, а затем рисовать полученную текстуру.
Пока это работает нормально, но когда я уменьшаю размер окна до более низкого разрешения, тогда то, что изначально было определено в Lwjgl3Launcher в функции getDefaultConfiguration(), в этой текстуре появляются артефакты.
Код: Выделить всё
configuration.setWindowedMode(800, 600);
Код: Выделить всё
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
/** {@link com.badlogic.gdx.ApplicationListener} implementation shared by all platforms. */
public class Main extends ApplicationAdapter {
private SpriteBatch batch;
private OrthographicCamera cameraMenu;
private Stage stage;
private Viewport viewportMenu;
final float GAME_WORLD_WIDTH = 10000;
final float GAME_WORLD_HEIGHT = 10000;
private FrameBuffer frameBuffer;
@Override
public void create() {
batch = new SpriteBatch();
cameraMenu = new OrthographicCamera();
viewportMenu = new ScreenViewport(cameraMenu);
viewportMenu.apply();
cameraMenu.position.set(GAME_WORLD_WIDTH / 2f,GAME_WORLD_HEIGHT / 2f, 0f);
stage = new Stage();
stage.setViewport(viewportMenu);
}
@Override
public void resize(int width, int height) {
viewportMenu.update(width, height);
stage.getViewport().update(width, height, true);
if (frameBuffer != null) {
frameBuffer.dispose();
}
frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, width, height, false);
}
@Override
public void render() {
ScreenUtils.clear(0f, 0f, 0f, 1f);
frameBuffer.begin();
Pixmap fg = Pixmap.createFromFrameBuffer(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
frameBuffer.end();
fg.setBlending(Pixmap.Blending.None);
// fg.setColor(new Color(0,0,0,0));
// fg.fill();
fg.setColor(Color.RED);
fg.fillRectangle(0, 0, fg.getWidth(), 10);
fg.fillRectangle(0, 0, 10, fg.getHeight());
fg.fillRectangle(0, fg.getHeight() - 10, fg.getWidth(), fg.getHeight() - 10);
fg.fillRectangle(fg.getWidth() - 10, 0, 10, fg.getHeight());
Texture fboTex = new Texture(fg);
batch.begin();
batch.setProjectionMatrix(cameraMenu.combined);
batch.draw(fboTex, 0, 0, fboTex.getWidth(), fboTex.getHeight(), 0, 0, 1, 1);
batch.end();
fboTex.dispose();
fg.dispose();
}
@Override
public void dispose() {
batch.dispose();
}
}
Кроме того, если я раскомментирую две строки в приведенном выше коде, артефакты также исчезнут, кажется как будто что-то идет не так, когда Pixmap создается из FrameBuffer.
В методе изменения размера я всегда устанавливаю размер FrameBuffer равным текущему размеру окна, следуя изображению, как оно выглядит на экран:
Изображение артефакта текстуры
РЕДАКТИРОВАТЬ: для моей цели мне нужно визуализировать эти объекты в специальный FrameBuffer потому что в противном случае я удалю/удалю весь экран, а не только планеты.
С FB: правильно отрезать планеты
Без FB: целиком экран отключен
Я что-то делаю неправильно при создании нового FrameBuffer правильного размера в методе изменения размера?
Подробнее здесь: https://stackoverflow.com/questions/793 ... gdx-window
Мобильная версия