我试着用上下文访问整个屏幕。
这是我当前的代码(当前仅此文件):

#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);

程序的输出(打印在错误处理if语句中)是
Failed with error 2000: The pixel format is invalid.

调用getdc(null)被指定为检索整个屏幕的dc,因此我不确定这里出了什么问题。我该怎么解决?
编辑:添加了更多信息

最佳答案

你没有设置像素格式。
查看文档here
您应该声明像素格式描述符,例如:

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函数。
更新
正如用户chris becke所指出的,不能在屏幕hdc上调用setpixelformat(根据操作代码使用getdc(null)获得)。这在khronos wiki上也有报道。
因此,还必须创建自己的窗口,获取其dc,然后使用它设置像素格式并创建gl上下文。如果你想渲染“全屏”,你只需创建一个无边界窗口与屏幕大小相同。关于这件事,我建议看看这里的答案。

关于c - wglCreateContext失败,错误为“像素格式无效”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50014602/

10-11 16:47