проблема opengl под перспективой - PullRequest
0 голосов
/ 16 октября 2008

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

Ниже я разместил код, который хорошо работает в 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);
}

Ответы [ 2 ]

1 голос
/ 16 октября 2008

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

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

0 голосов
/ 16 октября 2008

Попробуйте PFD_SUPPORT_COMPOSITION.

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

...