2014-02-10 8 views
1

OpenGL에서 화면을 렌더링 할 때 문제가 있습니다. FBO 및 PBO에 대해 많이 검색했지만 나에게 도움이되는 것은 없습니다. 문제는 CreateCompatibleDC에 의해 만들어진 memDC에서 나온 것 같습니다. 내가 m_hDC 있습니다에 memDC 및 createContext의없이 본을 programm을 실행하면 다음 오프 스크린 렌더링은 어떻게합니까?

는 아무 문제가 없었다, 내 코드

void COpenGLWnd::ShowinWnd(int ID) 
{ 
    m_hDC = ::GetDC(m_hWnd); 
    memDC = CreateCompatibleDC(m_hDC); 
    SetDCPixelFormat(memDC); 

    m_hRC = wglCreateContext(memDC); 
    VERIFY(wglMakeCurrent(memDC, m_hRC)); 
    m_isitStart = 0; 

    GLuint pbo; 
    glGenBuffersARB(1,&pbo); 
    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo); 
    glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, (m_WndWidth * 3 + 3)/4 * 4 * m_WndHeight, NULL, GL_STREAM_READ); 

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo); 

    switch(ID) 
    { 
    case T_FADEIN: 
     GLFadeinRender(); 
     break; 
    case T_PARANORAMAL: 
     GLParanormalRender(); 
     break; 
    case T_3DCUBE: 
     GL3DcubeRender(); 
     break; 
    default: 
     break; 
    } 

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo); 
    glReadBuffer(GL_BACK); 
    glReadPixels(0,0,m_WndWidth,m_WndHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE, 0); 
    BYTE* data = (BYTE*) glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); 
    if(data) 
    { 
     SaveBitmapToDirectFile(data); //this makes bitmap file with pixel BYTE array, "data". 
     glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); 
    } 

    glBindFramebuffer(GL_PIXEL_PACK_BUFFER_ARB,0); 

    SwapBuffers(memDC); 

    glDeleteBuffers(1,&pbo); 

    wglMakeCurrent(memDC, NULL); 
    wglDeleteContext(m_hRC); 
    DeleteDC(memDC); 
    ::ReleaseDC(m_hWnd, m_hDC); 
} 

의 일부입니다. 글쎄, 창문에 잘 작성된 비트 맵 파일에 렌더링됩니다. 하지만 나는 비트 맵 파일 만 저장하고 화면을 벗어난 상태로 렌더링하려고합니다. 어떻게 처리 할 수 ​​있습니까?

+0

답장을 보내 주셔서 감사합니다. 그러나 SelectObject를 어떻게 사용합니까? 다시 제발 그걸 권할 수 있을까요? – phraust

+0

__m_hMemBmp = :: CreateCompatibleBitmap (m_hDC, m_WndWidth, m_WndHeight);과 같은 초기화 단계에서 새 코드를 삽입했습니다. :: SelectObject (memDC, m_hMemBmp); __ 하지만 여전히 변경된 사항이 없습니다. – phraust

+0

저는 Borland를 사용하고 있으며, 그 아래에서 비트 맵 렌더링을 실행하지 않습니다. 그래서 문제가 지속되면 DC/RC를 추가하지 않고도 텍스처를 그릴 수 있습니다 (대상 윈도우 만 필요함) ... 그러나 텍스처의 크기는 일부 카드/드라이버에서 화면 해상도보다 훨씬 많습니다. 당신은 적용을 위해 더 많은 텍스처를 사용해야합니다. – Spektre

답변

1

MemDC는 자동으로 이전 OpenGL-1.1 소프트웨어 래스터 라이저로 돌아갑니다. 이 래스터 라이저는 매우 제한적이며 FBO, PBuffers 등과 같은 현대적인 기능을 지원하지 않습니다.

GPU 가속화 된 OpenGL 컨텍스트를 원할 경우 일반 창 (또는 PBuffer DC)에서이를 생성해야하지만 먼저 PBuffer DC를 얻으려면 먼저 창을 만들어야합니다. 컨텍스트를 얻기 위해 창만 있으면 렌더링 할 필요가 없으며 창이 항상 숨겨져있을 수 있습니다 (작성 프로세스의 ShowWindow 생략). 윈도우에 유효한 픽셀 포맷을 설정하면 HDC에서 OpenGL 컨텍스트를 만들 수 있습니다.

이미 창을 가지고 있으므로 그냥 따라가보십시오.

일반 창에서 OpenGL 컨텍스트를 사용하면 오프 스크린 렌더링에 FBO를 사용할 수 있습니다.