2016-12-29 1 views
5

LibGDX에서 내 데스크톱 응용 프로그램을 스크린 샷하는 다소 이상한 동작이 발생했습니다. 검은 배경과 빨간색 사각형 만 렌더링하는이 "버그"를 재현 할 작은 프로그램을 다시 만듭니다.LibGDX screenshot 이상한 동작

enter image description hereenter image description here

윈도우의 화면 클리핑 도구에서 스크린 샷되는 왼쪽 하나, 이것은이 프로그램을 실행 모습입니다 : 그 이미지는 결과이다. 오른쪽은 내가 조금 더 게시 한 스크린 샷 코드에서 온 것입니다. 명확히하기 위해, 나는 프로그램의 스크린 샷이 투명성이 전혀 이상하지 않고 왼쪽 이미지의 결과를 얻길 바란다.

이것은 내 렌더링 코드입니다. 좌표는 신경 쓰지 마세요. 직사각형이 완벽하게 렌더링 된 것을 볼 수 있기 때문에 렌더링 메서드에 오류가 있다는 것은 나에게 전혀 맞지 않습니다. 그러나 나는 그것을 어떻게해서든지 게시하고있다.

@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); 

} 

이 스크린 샷을 취할 수있는 코드 :

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; 
} 

내가 가서 연구, 나는 단지 정확히 같은 문제이다,이 topic을 발견했다. 그것은 약간의 정보와 대답이 없습니다. 나는 당신의 누군가가이 신비에 답할 수 있기를 바랍니다.

+0

그것은 버그가 아니다 : 내가 한 일은 (byte) 255 (불투명)에 getPixels()에 의해 반환 된 ByteBuffer의 모든 네 번째 요소 (알파 값)이 내 결과였다을 설정했다. 코드의 스크린 샷에는 그 당시에 백 버퍼에 있던 알파가 포함됩니다.이 알파는 런타임에 화면에 보이지 않습니다. 불투명 한 윈도우가 있기 때문입니다. – Tenfour04

+0

흠, 그래. 그것을 고쳐 줄 알아요? – Squiddie

+0

미리 곱셈 된 알파를 사용하여 FrameBuffer에 그린 다음 블렌드가 해제 된 상태로 FrameBuffer를 그립니다. 또는 저장하기 전에 픽스맵에서 각 픽셀의 알파를 수동으로 바꿉니다. – Tenfour04

답변

3

내 질문이 Tenfour04에 의해 2017년 2월 23일 대답했지만 그는 대답으로 자신의 솔루션을 게시에 관심을 표시하지 않기 때문에, 나는 그것이이 스레드를 해결하기 위해 일을하고있다. 그에게 큰 감사.

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

정말 고마워요. 방금 같은 문제가있었습니다. :) – Joschua