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