c - wglCreateContext mislykkes med fejl 'Pixelformatet er ugyldigt'

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få adgang til hele skærmen med konteksten.


Her er min nuværende kode (i øjeblikket kun denne fil):


#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
", (char) glGetString(GL\_VENDOR));

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

    return 0;
}


Problemet er i denne kode i starten:


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


og programmets output (trykt i fejlhåndteringen hvis erklæring) er


Failed with error 2000: The pixel format is invalid.


Opkald GetDC (NULL) er angivet som hentning af DC på hele skærmen, så jeg er ikke sikker på, hvad der går galt her. Hvordan løser jeg dette?


EDIT: tilføjet flere oplysninger

Bedste reference


Du har ikke indstillet pixelformatet.


Se dokumentationen her. [7]


Du bør erklære en pixelformat deskriptor, for eksempel:


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
};


Brug derefter SelectPixelFormat til at få pixelformatnummeret, fx: [8]


int iPixelFormat = ChoosePixelFormat(hdc, &pfd); 


og til sidst kalder SetPixelFormat-funktionen til at indstille det korrekte pixelformat, fx: §§9]]


SetPixelFormat(hdc, iPixelFormat, &pfd);


Først da kan du ringe til wglCreateContext -funktionen.


UPDATE


Som påpeget af brugeren Chris Becke kan man ikke ringe til SetPixelFormat på skærmen hDC (opnået med GetDC (NULL) ifølge OP-koden). Dette er også rapporteret i khronos wiki her. [10]


Derfor skal du også oprette dit eget vindue, opnå dets DC og derefter bruge det til at indstille pixelformatet og oprette GL-konteksten. Hvis du vil gøre 'fuldskærm', skal du simpelthen oprette et ramme uden vindue med samme størrelse på skærmen. Jeg foreslår at se på svarene på dette gamle spørgsmål her om SO om dette spørgsmål.