Сбой wglCreateContext с ошибкой «Недопустимый формат пикселей» - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь получить доступ ко всему экрану с контекстом.

Вот мой текущий код (в настоящее время только этот файл):

#include <stdio.h>
#include <Windows.h>
#include <GL/gl.h>
#include <gl/glu.h>
#include <GL/glext.h>

int main(int argc, char *argv[]) {
    HDC hdc = GetDC(NULL);
    HGLRC hglrc;
    hglrc = wglCreateContext(hdc);

    // Handle errors
    if (hglrc == NULL) {
        DWORD errorCode = GetLastError();
        LPVOID lpMsgBuf;
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            errorCode,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&lpMsgBuf,
            0, NULL );
        printf("Failed with error %d: %s", errorCode, lpMsgBuf);
        LocalFree(lpMsgBuf);
        ExitProcess(errorCode);
    }

    wglMakeCurrent(hdc, hglrc);

    printf("%s\n", (char) glGetString(GL_VENDOR));

    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hglrc);

    return 0;
}

Проблема в этом коде в начале:

    HDC hdc = GetDC(NULL);
    HGLRC hglrc;
    hglrc = wglCreateContext(hdc);

и вывод программы (напечатано в операторе обработки ошибок, если)

Failed with error 2000: The pixel format is invalid.

Вызов GetDC (NULL) определен как получение DC всего экрана, поэтому я не уверен, что здесь происходит неправильно.Как это исправить?

РЕДАКТИРОВАТЬ: добавлено больше информации

1 Ответ

0 голосов
/ 26 апреля 2018

Вы не установили формат пикселей.

Просмотрите документацию здесь .

Вы должны объявить дескриптор формата пикселей, например:

PIXELFORMATDESCRIPTOR pfd =
{
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,    // Flags
    PFD_TYPE_RGBA,        // The kind of framebuffer. RGBA or palette.
    32,                   // Colordepth of the framebuffer.
    0, 0, 0, 0, 0, 0,
    0,
    0,
    0,
    0, 0, 0, 0,
    24,                   // Number of bits for the depthbuffer
    8,                    // Number of bits for the stencilbuffer
    0,                    // Number of Aux buffers in the framebuffer.
    PFD_MAIN_PLANE,
    0,
    0, 0, 0
};

Затем используйте ChoosePixelFormat , чтобы получить номер формата пикселя, например:

int iPixelFormat = ChoosePixelFormat(hdc, &pfd); 

и, наконец, вызовите функцию SetPixelFormat , чтобы установитьправильный формат пикселей, например:

SetPixelFormat(hdc, iPixelFormat, &pfd);

Только тогда вы можете вызвать функцию wglCreateContext .

UPDATE

Как указал пользователь Крис Бекке , нельзя вызвать SetPixelFormat на экране hDC (полученного с помощью GetDC (NULL) согласно коду OP).Об этом также говорится в вики khronos здесь .

Поэтому вы также должны создать свое собственное окно, получить его DC, а затем использовать его для установки формата пикселей и создания контекста GL.Если вы хотите сделать «полноэкранный режим», вам просто нужно создать окно без полей с тем же размером экрана.Я предлагаю взглянуть на ответы на этот старый вопрос здесь, на ТАК по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...