OpenGL Win32 не рисует на экране - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь использовать glClearBufferfv(GL_COLOR, 0, red) для рисования красного экрана.

Программа отображает белый экран, и значок загрузки на курсоре постоянно вращается.

Я использую glew , Я также использую визуальную студию, и я думаю, что связал все необходимые библиотеки. Я использовал целое создание временного контекста для использования расширения wglCreateContextAttribsARB.

У меня есть 2 функции для настройки. первый создает окно и устанавливает pfd: (редактор неправильно форматирует мой код, поэтому я опущу имена функций)

int pf;
HDC hDC;
HWND hWnd;
WNDCLASS wc;
PIXELFORMATDESCRIPTOR pfd;
static HINSTANCE hInstance = 0;
if (!hInstance) {
    hInstance = GetModuleHandle(NULL);
    wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    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 = L"OpenGL";

    if (!RegisterClass(&wc)) {
        MessageBox(NULL, (LPCWSTR)L"RegisterClass() failed:  ", (LPCWSTR)L"Error", MB_OK);
        return NULL;
    }
}

hWnd = CreateWindow(TEXT("OpenGL"), TEXT("Pie"), WS_OVERLAPPEDWINDOW |
    WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    x, y, width, height, NULL, NULL, hInstance, NULL);

if (hWnd == NULL) {
    MessageBox(NULL, TEXT("CreateWindow() failed:  Cannot create a window."),
        TEXT("Error"), MB_OK);
    return NULL;
}

hDC = GetDC(hWnd);

/* there is no guarantee that the contents of the stack that become
   the pfd are zeroed, therefore _make sure_ to clear these bits. */
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;

pf = ChoosePixelFormat(hDC, &pfd);
if (pf == 0) {
    MessageBox(NULL, L"ChoosePixelFormat() failed:  "
        "Cannot find a suitable pixel format.", L"Error", MB_OK);
    return 0;
}

if (SetPixelFormat(hDC, pf, &pfd) == FALSE) {
    MessageBox(NULL, L"SetPixelFormat() failed:  "
        "Cannot set format specified.", L"Error", MB_OK);
    return 0;
}

DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);

ReleaseDC(hWnd, hDC);

return hWnd;

второй создает контекст и запускает сообщение l oop:

HDC hDC;
HGLRC hRCt, hRC;
HWND  hWnd;
MSG   msg;

hWnd = CreateOpenGLWindow("minimal", 0, 0, 256, 256, PFD_TYPE_RGBA, 0);
if (hWnd == NULL)
    exit(1);

hDC = GetDC(hWnd);
hRCt = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRCt);
glewExperimental = true;
glewInit();

int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
    WGL_CONTEXT_MINOR_VERSION_ARB, 5,
    WGL_CONTEXT_FLAGS_ARB, 0,
    0
};
hRC = wglCreateContextAttribsARB(hDC, 0, attribs);
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRCt);
wglMakeCurrent(hDC, hRC);

ShowWindow(hWnd, nCmdShow);

while (GetMessage(&msg, hWnd, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

wglMakeCurrent(NULL, NULL);
ReleaseDC(hWnd, hDC);
wglDeleteContext(hRC);
DestroyWindow(hWnd);

return msg.wParam;

Вот мой wndpro c:

   static PAINTSTRUCT ps;

switch (uMsg) {
case WM_PAINT:
    display();
    BeginPaint(hWnd, &ps);
    EndPaint(hWnd, &ps);
    return 0;

case WM_SIZE:
    //glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
    PostMessage(hWnd, WM_PAINT, 0, 0);
    return 0;

case WM_CHAR:
    switch (wParam) {
    case 27:            /* ESC key */
        PostQuitMessage(0);
        break;
    }
    return 0;

case WM_CLOSE:
    PostQuitMessage(0);
    return 0;
}

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

и вот моя функция отображения:

glClearBufferfv(GL_COLOR, 0, red);
glFlush();

красный - глобальный переменная, определенная как:

GLfloat red[4] = {1, 0, 0, 1};

Любая помощь, почему она не рисует на экране?

1 Ответ

1 голос
/ 06 марта 2020

Пожалуйста, укажите display() между BeginPaint и EndPaint.

Запустите операцию рисования, вызвав функцию BeginPaint . Эта функция заполняет структуру PAINTSTRUCT информацией о запросе на перерисовку.

После завершения рисования вызовите функцию EndPaint . Эта функция очищает область обновления, которая сообщает Windows, что окно завершило рисование самостоятельно.

См .: Рисование окна

Используйте пример чтобы быстро восстановить проблему:

 HDC hdc = GetDC(hWnd);
 case WM_PAINT:
        {
            PAINTSTRUCT ps; 
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 2));         
            BeginPaint(hWnd, &ps);              
            EndPaint(hWnd, &ps);
        }

Отладка:

1


 HDC hdc = GetDC(hWnd);
 case WM_PAINT:
        {
            PAINTSTRUCT ps;         
            BeginPaint(hWnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 2)); 
            EndPaint(hWnd, &ps);
        }

Отладка: 3

...