c ++ - OpenGL kontekst uden at åbne et vindue - wglMakeCurrent fejler med HDC og HGLRC, når du bruger HWND lavet med GetDesktopWindow

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er noget et duplikat af dette spørgsmål.


Jeg forsøger at lave en vinduesfri konsol ansøgning for at kontrollere OpenGL version understøttes. For at gøre dette skal jeg oprette en renderingsramme - men uden at skabe et vindue. Jeg forsøger at bruge desktop håndtag, som jeg ikke har skrevet til.


Jeg har glemt at indstille pixelformat i tidligere eksempel - det er sandsynligt grunden til, at oprettelsen af ​​render kontekst fejle - men selv med pixelformat sæt, kan jeg ikke aktivere det. wglMakeCurrent (hDC, hRC) returnerer bare 0.


Her er den komplette kildekode dump:


    #include <iostream>
    #include <GL/GLee.h>

    #include <windows.h>

HDC hDC = NULL;
HGLRC hRC = NULL;
HWND hWnd = NULL;
HINSTANCE hInstance;

int res = 0;
int pf = 0;
PIXELFORMATDESCRIPTOR pfd = {
    sizeof(PIXELFORMATDESCRIPTOR),
    1,                     /* version */
    PFD\_DRAW\_TO\_WINDOW |
    PFD\_SUPPORT\_OPENGL |
    PFD\_DOUBLEBUFFER,
    PFD\_TYPE\_RGBA,
    24,                    /* 24-bit color depth */
    0, 0, 0, 0, 0, 0,      /* color bits */
    0,                     /* alpha buffer */
    0,                     /* shift bit */
    0,                     /* accumulation buffer */
    0, 0, 0, 0,            /* accum bits */
    32,                    /* z-buffer */
    0,                     /* stencil buffer */
    0,                     /* auxiliary buffer */
    PFD\_MAIN\_PLANE,        /* main layer */
    0,                     /* reserved */
    0, 0, 0                /* layer masks */
};


std::string trash;

int main(int argc, char**argv) {

hInstance = GetModuleHandle(NULL);  // Grab An Instance For Our Window

hWnd = GetDesktopWindow();          // Instead of CreateWindowEx

if (!(hDC = GetDC(hWnd))) {
    std::cout << "Device context failed" << std::endl;

    std::cout << std::endl << "Press ENTER to exit" << std::endl;
    std::getline(std::cin, trash);
    return 1;
}

// pixel format
pf = ChoosePixelFormat(hDC, &pfd);
res = SetPixelFormat(hDC, pf, &pfd);

if (!(hRC = wglCreateContext(hDC))) {
    std::cout << "Render context failed" << std::endl;

    std::cout << std::endl << "Press ENTER to exit" << std::endl;
    std::getline(std::cin, trash);
    return 1;
}

if(!wglMakeCurrent(hDC,hRC)) { // fail: wglMakeCurrent returns 0
    std::cout << "Activating render context failed" << std::endl;

    std::cout << std::endl << "Press ENTER to exit" << std::endl;
    std::getline(std::cin, trash);
    return 1;
}

std::cout << "OpenGL 1.2 support ... ";
if (GLEE\_VERSION\_1\_2) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << "OpenGL 1.3 support ... ";
if (GLEE\_VERSION\_1\_3) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << "OpenGL 1.4 support ... ";
if (GLEE\_VERSION\_1\_4) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << "OpenGL 1.5 support ... ";
if (GLEE\_VERSION\_1\_5) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << "OpenGL 2.0 support ... ";
if (GLEE\_VERSION\_2\_0) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << "OpenGL 2.1 support ... ";
if (GLEE\_VERSION\_2\_1) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << "OpenGL 3.0 support ... ";
if (GLEE\_VERSION\_3\_0) {
    std::cout << "OK" << std::endl;
} else {
    std::cout << "FAIL" << std::endl;
}

std::cout << std::endl << "Press ENTER to exit" << std::endl;
std::getline(std::cin, trash);

// cleanup
wglMakeCurrent(NULL, NULL);     /* make our context not current */
wglDeleteContext(hRC);      /* delete the rendering context */
ReleaseDC(hWnd, hDC);               /* release handle to DC */

return 0;


}





edit: Jeg ved, at wglMakeCurrent () mislykkes, hvis en af ​​de håndtag, der sendes til den, er ugyldig, eller hvis den gengivelseskontekst, der skal blive aktuelt, for øjeblikket er aktuelt for en anden tråd, men jeg er ikke helt sikker på, hvilken af disse er sande i denne sag.

Bedste reference


Man må ikke oprette en OpenGL-kontekst på skrivebordet vinduet. For at oprette en OpenGL kontekst skal man indstille windows 's pixelformat, hvilket er strengt forbudt at blive gjort på skrivebordet vinduet.


Hvis du vil gøre offscreen-gengivelse, skal du bruge en PBuffer i stedet for et vindue eller oprette et vindue, du ikke kan synliggøre og bruge et Frame Buffer Object (FBO) som mål.

Andre referencer 1


Fungerer det, hvis du bruger CreateWindow () i stedet for GetDesktopWindow ()?


Jeg vil sige GetDesktopWindow () er yderst usandsynligt at arbejde. Jeg forventer at være i modsætning til et normalt vindue og den værdi, du modtager for at være en særlig håndteringsværdi.


Hvis skubbet kommer til at skubbe, skal du bare åbne et vindue uden WS\_VISIBLE. Ingen vil være klogere.


P.S. Jeg bemærker dig 'gør dette til en konsol-applikation. Jeg bliver meget overrasket over, om konsolprogrammer fungerer med noget grafisk, det være sig OpenGL eller bare Windows 2D-tegning API.


P.s.s Jeg er ganske sikker på, at Windows-programmer kan skrive (en eller anden måde) til stdout af kommandolinjen, de løber fra. Du kan simpelthen skrive en normal Windows-app, men bare udsende dit output til stdout.