我正在尝试制作* .obj加载程序。当我认为一切都解决了,我不能初始化GLEW与我的装载机一起工作。
问题是我的应用程序初始化看起来像这样:
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"Projekt";
RegisterClassEx(&wc);
hWnd = CreateWindowEx( NULL,
L"Projekt",
L"Symulator lodzi",
WS_OVERLAPPEDWINDOW,
100, 50,
SCREEN_WIDTH, SCREEN_HEIGHT,
NULL, NULL, hInstance, NULL);
if (!hWnd)
return 0;
ShowWindow(hWnd, nCmdShow); //wyswietlanie okna
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (err != GLEW_OK)
{
const GLubyte* error = glGetString(GL_VERSION);
const GLubyte* error2 = glewGetErrorString(err);
exit(1);
}
while (TRUE)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (msg.message == WM_QUIT)
break;
}
return msg.wParam;
}
调用CreateWindowEx之后,它全部转到WndProc函数中的WM_CREATE消息,如下所示:
case WM_CREATE:
{
SetTimer(hWnd, 1, 1000, (TIMERPROC)NULL);
if (oGL == NULL)
oGL = new OpenGL(hWnd);
hDC = GetDC(hWnd);
} break;
oGL构造函数代码在这里:
OpenGL::OpenGL(HWND hWnd)
{
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0,
0, 0, 0,
0, 0,
0, 0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,
0,
0
};
int pixelFormatID;
HDC hDC;
hDC = GetDC(hWnd);
pixelFormatID = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, pixelFormatID, &pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
ReleaseDC(hWnd, hDC);
}
所以我认为OpenGL已正确初始化,但后来我收到了这些错误:
我不明白为什么应用程序认为OpenGL尚未初始化,当它是(我一直在逐步调试它,并且肯定首先是创建窗口然后是oGL对象)。
答案 0 :(得分:1)
在尝试初始化GLEW时,您没有OpenGL上下文。只有在通过DispatchMessage进入消息循环后才会处理WM_CREATE消息。在处理WM_CREATE之前,您的程序没有上下文。
只需在创建窗口后创建OpenGL上下文,而不是在WM_CREATE中创建。更简单,避免订购问题。