2014-01-26 8 views
0

C++을 사용하여 비교적 MFC에 익숙하다. 보통 OpenGL에 대해 걱정하고있다.MFC와 OpenGL CLE, C++, GLEW 이후 OpenGL 초기화하기

OGL을 사용하여 C++ Win32를 작성한 것으로부터 OpenGL을 초기화하고 더미 창을 사용해야하는 창을 만들기 전에 GLEW를 초기화해야합니다. 멋지다.

MFC에서 멤버 OpenGL 클래스를 보유하는 CView 클래스를 파생 시켰습니다.

OnPreCreateWindow의 임시 창을 사용하여 GLEW를 성공적으로 초기화했으며, OpenGL을 성공적으로 초기화했지만 잘못된 HWND/HDC를 사용하여 성공적으로 초기화했습니다. 실제로 디버깅은 OpenGL 클래스의 구성원으로 보유 된 HDC를 알려줍니다 CDC의 OnDraw에서 얻은 것이 아닙니까?

Wheres 내 올바른 HDC for OpenGL? - MFC 도움말이 필요해! 이 DC를 수시로 업데이트해야합니까?

OpenGL을 올바른 DC로 초기화/업데이트하려면 OnInitialUpdate, OnPreCreateWindow 및 OnDraw (CDC *)를 선택해야합니다.

void CJesseView::OnInitialUpdate() 
{ 
    CView::OnInitialUpdate(); 
    HDC hDC = GetDC()->m_hDC; 
} 

GLEW가 작동하고 초기화됩니다. 다른 곳에서해야합니까?

BOOL CJesseView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
    // TODO: Modify the Window class or styles here by modifying 
    // the CREATESTRUCT cs 

    /* modify the style of the view/window */ 
    cs.dwExStyle |= CS_OWNDC; 

    /* OpenGL Set up 
     1. Create a faux window 
    */ 
    CString m_ClassName("JesseGLView"); 

    HWND hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_ClassName, m_ClassName, 
        WS_POPUP, 0, 0, 640, 480, NULL, NULL, cs.hInstance, NULL); 

    ::ShowWindow(hwnd, SW_HIDE); // Don't show the window. 

    /* OpenGL Set up  
     2. Initialise Glews extension Library to give us access to OpenGL 4.1 Core 
    */ 
    m_OpenGL = new OpenGL(); 

    if(! m_OpenGL->PreInjectGLEW(hwnd)) 
     MessageBox(_T("No OpenGL Niceties - Couldn't initialise GLEW!"), _T("CJesseView")); 

    ::DestroyWindow(hwnd); //Destroy Window now that the extensions are loaded 
    hwnd = NULL; 

    //.. 
    return CView::PreCreateWindow(cs); 
} 

void CJesseView::OnDraw(CDC* pCDC) 
{ 
    CJesseDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc); 

    // TODO: add draw code for native data here 

    BeginScene(0.4, 0.4, 0.8, 1.0); 
    // Draw something! 
    EndScene(); 

    //.. 
    ::SwapBuffers(pCDC->GetSafeHdc()); 
} 

int CJesseView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
    if (CView::OnCreate(lpCreateStruct) == -1) 
     return -1; 

    // TODO: Add your specialized creation code here 
    m_OpenGL->Create(AfxGetApp()->GetMainWnd()->GetSafeHwnd(), 
       true, 800, 600, 0.1f, 60000.0f); // VSYNC, 0.1, 60k for near and far 

    return 0; 
} 

그리고 마지막으로 내 OpenGL을 ::() 함수를 작성 아니라 오류가 .. 나는 내가 HDC을 얼마나 원문에 전달하는 HWND와 함께 할 수

bool OpenGL::InitOpenGL(HWND hWnd, int sW, int sH, float nearP, float farP, bool vsync) 
{ 
    bool bOk = false; 
    bool error = false; 

    m_Context = GetDC(hWnd); 

    //do some PIXELFORMATDESCRIPTOR and context attrib setup 

    bOk = bOk && (m_Renderer = wglCreateContextAttribsARB(m_Context, 0, actualContextAttribs)); 

    if(! bOk) 
     return false; 

    if(! wglMakeCurrent(m_Context, m_Renderer)) {  
     wglDeleteContext(m_Renderer); 
     return false; 
    } 

    //... other stuff 
} 

답변

0

I있어 OpenGL을 초기화하기 전에 GLEW를 초기화해야합니다.

아니요. GLEW는 제대로 초기화하기 위해 기존의 OpenGL 컨텍스트가 필요합니다. 이것은 또한 GLEW 매뉴얼에 분명하게 명시되어있다. 그럼 Read The Fine Manual (RTFM)을 참조하십시오.

이제 고급 OpenGL 컨텍스트를 만드는 GLEW는 거의 도움이되지 않습니다. 확장 기능 wgl… 함수에 대한 함수 포인터를 가져 오는 데 사용하는 프록시 OpenGL 컨텍스트를 먼저 만들어야합니다. 여기에 MFC를 신경 쓰지 마라. 일반 Win32 함수를 사용하십시오. 여기에서 매우 잘 설명됩니다 : http://www.opengl.org/wiki/Creating_an_OpenGL_Context_(WGL)#Proper_Context_Creation

일단 적절한 OpenGL 컨텍스트를 얻으면 GLEW를 사용할 수 있습니다.

+0

"OnPreCreateWindow의 임시 창을 사용하여 GLEW를 성공적으로 초기화했으며, OpenGL을 성공적으로 초기화했지만 잘못된 HWND/HDC로 초기화되었습니다. 실제로 디버깅은 OpenGL 클래스의 구성원으로 보유한 HDC를 알려줍니다 CDC의 OnDraw에서 얻은 것이 아닙니까? " 글을 올린 후 glClearColour에 넣은 파란색이 보입니다. Google을 통해 Eric Idelson이라는 누군가의 작업 코드 예제를 발견했으며 고급 컨텍스트를 설정할 때 잘못된 HDC를 얻고 있음을 알았습니다. – mynameisnafe