2017-10-08 12 views
0

렌더 버스로 오프 스크린 프레임 버퍼에 삼각형을 렌더링하는 데 LWJGL을 사용하고 있습니다. 장면을 렌더링 한 후, glReadPixels을 사용하여 렌더 버퍼에서 RAM으로 데이터를 읽습니다. 처음 몇 프레임은 훌륭하게 작동하지만 프로그램이 충돌합니다 (SEGFAULT 또는 SIGABRT, ...).몇 프레임 후에 glReadPixels에서 LWJGL이 충돌합니다.

내가 뭘 잘못하고 있니? 어떠한 방식의 ByteBuffer 액세스 기본적 glReadPixels, ByteBuffer.get() 사용하거나

//Create memory buffer in RAM to copy frame from GPU to. 
ByteBuffer buf = BufferUtils.createByteBuffer(3*width*height); 

while(true){ 
    // Set framebuffer, clear screen, render objects, wait for render to finish, ... 
    ... 

    //Read frame from GPU to RAM 
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buf); 

    //Move cursor in buffer back to the begin and copy the contents to the java image 
    buf.position(0); 
    buf.get(imgBackingByteArray); 

    //Use buffer 
    ... 
} 

답변

0

은 버퍼 포인터의 현재의 위치를 ​​변경한다. 여기에 어떻게됩니까

은 다음과 같습니다 버퍼의

  1. 위치는 초기에 제로이다.
  2. glReadPixels에 복사 현재 위치가 상기 버퍼에 기록 된 바이트의 크기로 변경됩니다 현재 위치 (= 0)
  3. 시작하는 버퍼의 GPU에서 바이트.
  4. buf.position(0)
  5. imgBackingByteArray 을 0
  6. buf.get() 복사 버퍼의 바이트 위치를 재설정하고 판독 된 바이트의 양과 위치를 변경
  7. 루프의 다음 반복에 바이트를 읽으려고 버퍼가 있지만 현재 위치는 버퍼의 끝 부분에 있으므로 버퍼 오버플로가 발생합니다. 이로 인해 충돌이 발생합니다.

솔루션 :

//Make sure we start writing to the buffer at offset 0 
buf.position(0); 
//Read frame from GPU to RAM 
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buf); 

//Move cursor in buffer back to the begin and copy the contents to the java image 
buf.position(0); 
buf.get(imgBackingByteArray);