2016-12-29 43 views
5

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

enter image description hereenter image description here

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ę.

+0

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

+0

Hm, czy tak jest. Czy wiesz, aby to naprawić? – Squiddie

+0

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

Odpowiedz

3

Moje pytanie odpowiedział 23. lut 2017 przez Tenfour04 ale jak on nie wykazuje zainteresowania opublikowania jego rozwiązanie jako odpowiedź, robię to, aby rozwiązać ten wątek. Ogromne dzięki dla niego. Co zrobiłem było ustawić każdy element czwarty (wartość alfa) w ByteBuffer zwrócony przez getPixels() do (byte) 255 (nieprzezroczyste) To był mój wynik:

private static Pixmap getScreenshot(int x, int y, int width, int height) { 

    final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, width, height); 

    ByteBuffer pixels = pixmap.getPixels(); 
    for(int i = 4; i < pixels.limit(); i += 4) { 
     pixels.put(i - 1, (byte) 255); 
    } 

    int numBytes = width * height * 4; 
    byte[] lines = new byte[numBytes]; 
    int numBytesPerLine = width * 4; 
    for(int i = 0; i < height; i++) { 
     pixels.position((height - i - 1) * numBytesPerLine); 
     pixels.get(lines, i * numBytesPerLine, numBytesPerLine); 
    } 
    pixels.clear(); 
    pixels.put(lines); 
    pixels.clear(); 

    return pixmap; 
} 
+0

Dziękuję bardzo. Właśnie miałem ten sam problem. :) – Joschua