2011-07-30 2 views
2

OpenGL에서 렌더링 된 GLUT 창에서 이미지를 스크리닝하고 싶습니다. 디스플레이 콜백 측면에서 다음 코드를 삽입했습니다.GLUT_malloc 오류가있는 OpenGL

display() { 
     drawTriangle(); //Renders the image 
     if(shouldDisplay) { 
      shouldDisplay=0; 
      bytes = width*height*3; //Color space is RGB 
      buffer = (GLubyte *)malloc(bytes); //buffer is global var for now 
       glFinish(); 
      glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer); 

     } 
     glutSwapBuffers(); 
    } 

이 코드를 실행하면 malloc이 실패하기 시작합니다. 그것은 ENOMEM, 오류 12와 함께 실패합니다. 왜 이런 일이 일어나고 있는지 이해하기 위해서는 운영 체제 나 GLUT에 대해 충분히 알지 못합니다. 난 단지 3 기가 바이트와 컴퓨터에 17K를 할당하려고 해요. Windows XP 및 Visual Studio C++ 2010 Express를 사용하고 있습니다. 어떤 도움이나 제안을 주시면 감사하겠습니다.

+0

너비, 높이 및 바이트의 종류, 코드를 실행 한 횟수 및 메모리를 다른 곳에서 자유롭게하고 있습니까? – ergosys

+2

좋은 분 .. 아무런 자유()가 보이지 않아요 :) – nielsj

답변

2

그 코드는 마지막에 free(buffer)이 누락되어 있으므로 각 다시 그리기에서 메모리 및/또는 주소 공간이 부족할 때까지 더 많은 메모리가 소비됩니다 (32 비트 시스템에서만 나중에 64 비트 주소 합리적인 시간에 작은 할당으로 공간이 거의 소모되지 않음).

+0

친구와 함께 디버그 세션에서 누락 된 무료 버퍼를 찾았습니다. 그것은 제가 설명한 문제를 일으키고있었습니다. 그것을 보아 주셔서 고마워요. 그런 뼈다른 실수를 게시하는 것에 대해 유감입니다. – ahoffer

1

나는이 답답한 대답을 다시 말해 보겠습니다. 나는 이 누락되어 힙이 휴지통에 있다고 생각합니다. free() 및 대상 버퍼를 덮어 쓰는 glReadPixels에 의한 연속적인 할당이있을 수 있습니다.

대부분의 프레임 버퍼는 적어도 32 비트/dword 정렬되어 있으며 여기에 언급 된 것처럼 w * h * 4 바이트는 내부 표현과 일치하기 때문에 작동 할 수도 있음을 나타냅니다.

정렬을 1 바이트로 설정하면 (다른 답변과 마찬가지로) 나에게 너무 좋아 보인다.

1

glReadPixels를 호출하기 전에 glPixelStorei(GL_PACK_ALIGNMENT, 1);을 시도하십시오.