2012-11-25 4 views
1

저는 처음에 libgdx입니다. 작동하는 게임 엔진에서 ~ 100 개의 개체를 썸글 네일 크기의 이미지로 렌더링하려고합니다. 표시 할 수있는 Java Image입니다. Swing 응용 프로그램입니다.libgdx에서 Java 이미지로 완전히 벗어난 화면으로 렌더링합니다.

나는 LwjglCanvas 잘 내에서 화면을 렌더링 할 수있는, 거기에서 나는 그들의 픽셀 ScreenUtils.getFrameBufferPixels() (graphics로 렌더링되는 아무것도에서 LwjglCanvas.paint(graphics) 방법 결과에 BufferedImagegetGraphics() 전달하려고)를 사용하여 잡아 수 있으며, 그들을 BufferedImage에 넣으십시오. 그러나 이것은 기존의 표시가 필요합니다. LwjglCanvas; 화면에 렌더링하지 않고 백그라운드 스레드 미리보기를 수행하는 방법을 알아낼 수 없습니다.

현재 코드 스 니펫 첨부 (캔버스에 표시된 이미지가 필요,이 캔버스에 canvas.postRunnable()을 통해 게시 됨) 내에서 실행됩니다.

// canvas is an LwjglAWTCanvas 
int w = canvas.getGraphics().getWidth(); 
int h = canvas.getGraphics().getHeight(); 
BufferedImage bi = new BufferedImage(w, h, 
     BufferedImage.TYPE_INT_ARGB); 
WritableRaster wr = bi.getRaster(); 
byte[] bytes = ScreenUtils.getFrameBufferPixels(0, 0, w, h, false); 
int[] pixel = new int[4]; 
for (int y = h-1, b = 0; y >=0 h; y--) { 
    for (int x = 0; x < w; x++) { 
     pixel[0] = bytes[b++]; 
     pixel[1] = bytes[b++]; 
     pixel[2] = bytes[b++]; 
     pixel[3] = bytes[b++]; 
     wr.setPixel(x, y, pixel); 
    } 
} 
image = bi; // image is the rendered output image 

답변

1

나는 FrameBuffer 개체가 필요하다고 생각합니다. OpenGL ES 2.0 이상에서 지원되며 OpenGL 그리기 명령을 오프 스크린 버퍼로 실행할 수 있습니다.

FBO가 '현재'인 경우 getFrameBufferPixels이 FBO와 작동한다고 생각했지만 실제로는 그렇지 않다고합니다. (원시는 OpenGL과 함께 작동하기 때문에 libGDX 나 OpenGL ES에 뭔가가 빠졌는지 확실하지 않습니다. FBOs render to texture and glReadPixels 참고).

+0

이 시나리오에서는 FBO를 사용하는 예를 살펴 보았습니다. 그러나, 그것은 게임 객체 (이미지, 애니메이션, ...)를 FBO에 직접 렌더링하기 위해 모든 렌더링 (기본적으로 LwjglCanvas 및 헬퍼 클래스를 다시 구현해야 함)을 다시 작성해야하는 것처럼 보입니다. gdx noob , 나는 시작하기를 꺼린다. – tucuxi

+1

@tucuxi 나는 fb.begin() 및 fb.end() 호출에서 기존 코드를 감쌀 수 있다고 생각한다. 상태 (렌더링 대상)는 OpenGL 내부에 보관되므로 java.awt 프리미티브를 사용하여 게임 객체를 렌더링하지 않는 한 아무 것도 변경하지 않아도됩니다. –

+1

getFrameBufferPixels에 의해 FBO에서 픽셀을 다시 얻을 수 없습니다. 하지만 FBO에 첨부 된 텍스처를 Pixmap에 렌더링 한 다음 거기에서 픽셀을 읽을 수 있습니다. 또한 FBO를 사용하면 컬러 버퍼에서 직접 픽셀 액세스보다 더 효율적입니다. –

관련 문제