2016-11-10 4 views
0

J'essaie de créer une application OpenGL sous Windows. Autant que je puisse comprendre, une des premières choses que je dois acquérir est un contexte de dispositif, qui doit être passé à quelques fonctions qui choisissent et établissent un format de pixel et créent un contexte de rendu. J'ai utilisé the OpenGL wiki pour avoir une idée approximative de ce que je devrais faire. Mon code est quelque chose comme:OpenGL get Device Contexte

#include <iostream> 
#include <windef.h> 
#include <wingdi.h> 

HDC hdc; 

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

Cette imprime

HDC: 0 

Je supposais un contexte périphérique fait référence à un dispositif physique, mais je lu quelque part qu'il fait référence à une « surface » drawable. Dans les deux cas est ma question: comment puis-je obtenir un DC non-nul? Ou devrais-je effectuer un ensemble d'étapes complètement différent afin de configurer tout ce système OpenGL?

J'ai trouvé beaucoup de tutoriels en ligne, mais ils utilisent tous les bibliothèques GLUT, GLEW, GLFW, X11, SDL, etc. Les bibliothèques facilitent certaines choses, mais elles n'effectuent généralement pas de tâches impossibles sans les utiliser. Cette fois, je veux essayer de faire les choses à la dure et donc n'utiliser aucune bibliothèque, juste OpenGL.

J'ai trouvé, enfin, a tutorial qui utilisait seulement les bibliothèques Windows pour créer une fenêtre.

+0

je penserais aussi, mais l'article concerne principalement la création d'un contexte OpenGL, tandis que le contexte dont j'ai besoin est un contexte de périphérique. L'article stipule: "Vous devez savoir ce qu'est un handle de fenêtre (HWND) et un contexte de périphérique (DC), ainsi que la façon de les créer." –

+0

Donc, vous voulez dire que le code n'est pas applicable dans ce cas. Je pense que vous pourriez avoir raison, mais alors la question devient comment je dois en créer un. –

+0

Désolé, vous avez raison; parce que c'était une fonction WGL, je l'ai confondu avec 'wglGetCurrentContext'. –

Répondre

3

Vous n'avez pas indiqué votre OS mais je suppose Windows à partir des noms de fonctions. Le problème est exactement comme Reto Koradi a déclaré dans le commentaire. Pour configurer OpenGL que vous devez faire ceci:

  1. Obtenir poignée OS pour objet avec contexte de périphérique valide

    Il peut être WindowsOS ou OS bitmap. Si vous n'avez que l'application console, vous devez d'abord créer une fenêtre OS valide et utiliser sa poignée (à ma connaissance, la console ne dispose pas de Canvas).

    vous pouvez utiliser GLUT pour la création de la fenêtre ou si votre compilateur IDE a une fenêtre App vous pouvez l'utiliser. Vous pouvez également combiner OpenGL et les composants de fenêtre. VCL est pas non plus un problème (je l'utilise depuis des années avec OpenGL)

    Dans Windows, vous pouvez utiliser CreateWindowEx si google un exemple pour elle ...

    Quoi qu'il en soit, vous devriez avoir votre poignée une variable comme:

    HWND hwin=NULL; 
    

    Si vous avez aucune expérience avec les applications Windows puis utilisez GLUT pour cela. Sinon, vous aurez besoin d'apprendre beaucoup de choses juste pour couvrir la création de fenêtre, le traitement des messages d'événements et l'interaction utilisateur/application qui peut être vraiment écrasante pour une recrue sans guide.

  2. Get contexte de périphérique pour que la poignée

    HDC hdc = GetDC(hwin); 
    
  3. Définir le format de pixels dont vous avez besoin du contexte de l'appareil

    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. Créer contexte de rendu OpenGL pour le contexte de l'appareil

    HGLRC hrc = wglCreateContext(hdc); 
    
  5. Définir comme contexte OpenGL par défaut

    wglMakeCurrent(hdc, hrc); 
    

Ceci est minimum absolu sans aucun contrôle d'erreur, des tampons supplémentaires, etc. Pour plus d'informations et le code réel voir liés QA « s :

Vous pouvez utiliser GLUT pour tout cela. Ceci est le premier coup, j'ai trouvé par recherche rapide:

Ou suivez tutoriels OpenGL il y a des tonnes là-bas ...

+0

Je suis désolé de ne pas avoir mentionné mon système d'exploitation. Ce sont les fenêtres, comme vous l'avez déjà deviné. En ce qui concerne les étapes que vous avez décrites: je reçois 3, 4 et 5 car elles sont clairement décrites dans l'article wiki que j'ai utilisé. Merci de préciser que je dois d'abord créer une fenêtre. A propos de l'utilisation de GLUT ... GLUT est une bibliothèque, ce qui signifie qu'il y a probablement aussi un moyen de créer une fenêtre sans l'utiliser? CreateWindow ou CreateWindowEx peuvent fonctionner, alors je vais essayer cela. Je vous remercie. –