Napotkałem dość dziwne zachowanie podczas zrzutu ekranu mojej aplikacji na pulpicie w LibGDX. Przeprojektowałem mały program, aby odtworzyć ten "błąd", który renderuje tylko czarne tło i czerwony prostokąt. Obrazy te są wyniki:Zrzut ekranowy LibGDX dziwne zachowanie
Lewa jedna jest zrzut ekranu z narzędzia przycinania okno ekran, jest to, co wygląda jak działa program. Prawo pochodzi z kodu z ekranu, który napisałem nieco dalej. Aby to wyjaśnić, chcę, aby zrzut ekranu programu uzyskał wynik lewego obrazu, bez przezroczystości, która stała się dziwna.
To jest mój kod renderowania, nie myśl o współrzędnych. Ponieważ widzę, że prostokąt jest renderowany idealnie, nie ma dla mnie sensu, aby błąd był w metodzie renderowania. Ale i tak to publikuję.
@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0);
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
shape.begin(ShapeType.Filled);
shape.setColor(Color.BLACK);
shape.rect(0, 0, 300, 300);
shape.setColor(1f, 0f, 0f, 0.5f);
shape.rect(100, 100, 100, 100);
shape.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
}
Jest to kod, aby zrobić zrzut ekranu:
public static void screenshot() {
Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
PixmapIO.writePNG(new FileHandle(Gdx.files.getLocalStoragePath() + "screenshots/test.png"), pixmap);
pixmap.dispose();
}
private static Pixmap getScreenshot(int x, int y, int w, int h) {
final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);
// Flip the pixmap upside down
ByteBuffer pixels = pixmap.getPixels();
int numBytes = w * h * 4;
byte[] lines = new byte[numBytes];
int numBytesPerLine = w * 4;
for(int i = 0; i < h; i++) {
pixels.position((h - i - 1) * numBytesPerLine);
pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
}
pixels.clear();
pixels.put(lines);
return pixmap;
}
poszedłem i zbadane, ja tylko znalazłem ten topic, który jest dokładnie taki sam problem. Ma jednak nieco mniej informacji i nie ma odpowiedzi. Mam nadzieję, że ktoś z was może odpowiedzieć na tę zagadkę.
To nie jest błąd. Zrzut ekranu z kodu zawiera wszystko, co w tym czasie znajduje się w buforze wstecznym, co nie jest widoczne na ekranie w czasie pracy, ponieważ masz nieprzezroczyste okno. – Tenfour04
Hm, czy tak jest. Czy wiesz, aby to naprawić? – Squiddie
Użyj premiliplied alpha, narysuj do FrameBuffer, a następnie narysuj FrameBuffer na ekranie przy wyłączonym mieszaniu lub ręcznie zastąp alfa każdego piksela w pixmapie przed jego zapisaniem. – Tenfour04