OpenGL ottiene il contesto del dispositivo

Sto cercando di creare un’applicazione OpenGL su Windows. Per quanto posso capire, una delle prime cose che devo acquisire è un Device Context, che deve essere passato a un paio di funzioni che scelgono e impostano un formato pixel e creano un contesto di rendering. Ho usato il wiki OpenGL per avere un’idea approssimativa su cosa dovrei fare. Il mio codice è qualcosa del tipo:

#include  #include  #include  HDC hdc; int main() { hdc = wglGetCurrentDC(); std::cout << "HDC: " << hdc << std::endl; return 0; } 

Questo stampa

 HDC: 0 

Ho ipotizzato che Device Context si riferisca a un dispositivo fisico, ma ho letto da qualche parte che si riferisce a qualsiasi “superficie” disegnabile. In entrambi i casi è la mia domanda: come posso ottenere una DC non nulla? O dovrei eseguire una serie di passaggi completamente diversa per configurare questo intero sistema OpenGL?

Ho trovato un sacco di tutorial online, ma tutti usano GLUT, GLEW, GLFW, X11, SDL ecc. Che sono librerie. Le librerie semplificano alcune cose, ma di solito non eseguono attività che sono impossibili senza usarle. Questa volta, voglio provare a fare le cose nel modo più duro e quindi non usare librerie, semplicemente OpenGL.

Ho trovato, finalmente, un tutorial che utilizzava solo le librerie di Windows per creare una finestra.

Non hai indicato il tuo sistema operativo ma presumo Windows dai nomi delle funzioni. Il problema è esattamente come Reto Koradi ha dichiarato nel commento. Per configurare OpenGL è necessario eseguire questa operazione:

  1. Ottieni l’handle del SO per l’object con il contesto del dispositivo valido

    Può essere una finestra OS o una bitmap del sistema operativo . Se hai solo l’app per console, devi prima creare una finestra OS valida e usare il suo handle (per la mia console della conoscenza non hai Canvas).

    puoi usare GLUT per la creazione della finestra o Se il tuo compilatore IDE ha una finestra App puoi usarlo. Puoi anche combinare i componenti OpenGL e Window. Anche VCL non è un problema (lo uso da anni con OpenGL )

    In Windows puoi usare CreateWindowEx quindi google un esempio per questo …

    Ad ogni modo dovresti avere il tuo manico in una variabile come:

     HWND hwin=NULL; 

    Se non hai esperienza con le applicazioni Windows, usa GLUT per questo. Altrimenti dovresti imparare molte cose solo per coprire la creazione di windows, la gestione dei messaggi degli eventi e l’interazione utente / app che può essere davvero travolgente per un principiante senza una guida.

  2. Ottieni il contesto del dispositivo per quell’handle

     HDC hdc = GetDC(hwin); 
  3. Imposta il formato pixel necessario per il contesto del dispositivo

     PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); // set the pixel format for the DC pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 24; pfd.iLayerType = PFD_MAIN_PLANE; SetPixelFormat(hdc,ChoosePixelFormat(hdc, &pfd),&pfd); 
  4. Crea un contesto di rendering OpenGL per il contesto del dispositivo

     HGLRC hrc = wglCreateContext(hdc); 
  5. Impostalo come contesto OpenGL predefinito

     wglMakeCurrent(hdc, hrc); 

Questo è il minimo assoluto senza alcun controllo degli errori, buffer addizionali, ecc. Per maggiori informazioni e codice reale vedi i QA correlati:

  • Come eseguire il rendering di una cornice openGL in C ++ builder? per oldstyle GL
  • semplice esempio completo GL + VAO / VBO + GLSL + shaders in C ++ con le nuove cose

Puoi usare GLUT per tutto questo. Questo è il primo colpo che ho trovato con la ricerca rapida:

  • Come posso impostare un display OpenGL (Window creato da OpenGL) per massimizzare?

Oppure segui le esercitazioni di OpenGL, ce ne sono tantissime là fuori …