2008-10-16 2 views
0

Я только что начал с opengl, но я столкнулся с каким-то странным поведением.проблема opengl под vista

Ниже я опубликовал код, который хорошо работает в xp, но на Vista он отображает только черный экран.

Извините за неудовлетворительное (как для этой платы) сообщение.

Есть ли что-то очень специфическое для открытия gl в Vista? Благодарю.

#include<windows.h> 
#include<gl\gl.h> 
#include<gl\glu.h> 
#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "glu32.lib") 

void InitGL(void) 
{ 
glClearColor(1,0.3f,0.3f,0.3f); 
} 

void DrawGLScene(void) 
{ 
/* code removed */ 
} 

HGLRC hRC = NULL; 
HDC hDC = NULL; 
HWND hWnd = NULL; 
HINSTANCE hInstance = NULL; 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 

bool CreateGLWindow(char* title, int width, int height) 
{ 
GLuint PixelFormat; 
WNDCLASS wc; 
RECT WindowRect; 
WindowRect.left = (long)0; 
WindowRect.right = (long)width; 
WindowRect.top = (long)0; 
WindowRect.bottom = (long)height; 
LPCSTR nazwa = TEXT("Start"); 

hInstance = GetModuleHandle(NULL); 
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 
wc.lpfnWndProc = (WNDPROC)WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance = hInstance; 
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); 
wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = NULL; 
wc.lpszMenuName = NULL; 
wc.lpszClassName = nazwa; 

RegisterClass(&wc); 

hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, nazwa, 
         nazwa, 
         WS_SYSMENU | 
         WS_CLIPSIBLINGS | 
         WS_CLIPCHILDREN, 
         0,0, 
         width, 
         height, 
         NULL, 
         NULL, 
         hInstance, 
         NULL); 

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, 
    16, 
    0, 
    0, 
    PFD_MAIN_PLANE, 
    0, 
    0,0,0 
}; 

hDC = GetDC(hWnd); 
PixelFormat = ChoosePixelFormat(hDC, &pfd); 
HRESULT rez = SetPixelFormat(hDC, PixelFormat, &pfd); 
hRC = wglCreateContext(hDC); 
wglMakeCurrent(hDC, hRC); 
ShowWindow(hWnd, SW_SHOW); 
InitGL(); 
return true; 

} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
switch(uMsg) 
{ 
case WM_ACTIVATE: 
    { 
     return 0; 
    } 
case WM_CLOSE: 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 
} 

return DefWindowProc(hWnd, uMsg, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, 
int nCmdShow) 
{ 
MSG msg; 
bool done = false; 

if (!CreateGLWindow(NULL, 800,600)) 
{ 
    return 0; 
} 

while(!done) 
{ 
    if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
     if (!GetMessage(&msg, 0, 0, 0)) done = true; 
     else { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    else 
    { 
     DrawGLScene(); 
     SwapBuffers(hDC); 
    } 
} 

return (msg.wParam); 
} 

ответ

1

Что он должен делать? В соответствии с кодом, который вы там разместили, он не должен ничего делать, кроме как показывать черный экран. Чего вы ожидаете?

Единственное, что я вижу, это то, что вы устанавливаете glClearColor, но вы никогда не вызываете glClear, чтобы ничего не делать.

+0

Извините, это была моя ошибка. Спасибо, что указали это. – kamilw

+0

@kamilo: Тогда как он отлично работал на XP? –

+0

Переписав его на Vista, я пропустил этот. Я должен положить пробелы между строками, поэтому в следующий раз я не буду опускать что-то важное. – kamilw

0

Пробег: PFD_SUPPORT_COMPOSITION.

Если это не удается, отправьте результат DescribePixelFormat и glGetString(GL_RENDERER);, чтобы помочь диагностировать проблему немного больше.

+0

Это была моя ошибка, как указал Джеральд. Спасибо за ваш ответ. – kamilw

 Смежные вопросы

  • Нет связанных вопросов^_^