2009-05-18 7 views
2

Je suis novice en programmation U/I et j'essaie de démarrer avec OpenGL. Quand je lance un exemple de programme qui crée une nouvelle fenêtre OpenGL avec GLUT, cela fonctionne très bien. Bien. Cependant, dans le cadre d'un autre programme, où je dois répondre à dessiner les événements (sous Windows), avec un contexte de périphérique m'a passé - et où je ne pourrais pas avoir GLUT disponible - ma confusion est la suivante:Comment fonctionnent les contextes OpenGL et les contextes de périphériques?

  1. Quand un contexte de périphérique est-il créé et détruit? Est-ce que je peux dessiner selon le contexte de l'appareil qui m'est donné, ou seulement certains d'entre eux (et comment le savoir)? Dois-je créer mon propre contexte OpenGL et l'utiliser pour dessiner, ou puis-je utiliser un contexte OpenGL "actuel"? Dois-je recréer le contexte chaque fois qu'un événement de tirage est envoyé?

Au fond ma question est, étant donné une situation où je suis envoyé des événements « Draw », à quelle fréquence dois-je essayer de créer des contextes OpenGL et comment est-ce lié à la création/cycle de destruction des contextes de l'appareil?

Répondre

7

En général, il est généralement prudent de considérer un seul contexte OpenGL comme une fenêtre, en particulier sur Windows.

Un contexte de périphérique sera (généralement) mappé à un handle de fenêtre (HWND). C'est en fait un DC (HDC est le handle), mais normalement vous associez un HDC avec un seul HWND. Sous Windows, vous allez créer une fenêtre à utiliser en fonction de la fenêtre à l'écran où vous souhaitez effectuer le rendu.

Généralement, vous réutiliserez ce contexte de périphérique pour l'intégralité de l'exécution de votre application. Si vous souhaitez effectuer un rendu dans une fenêtre différente, vous devez générer un contexte de périphérique (HDC) pour le nouveau handle de fenêtre. En outre, le rendu hors écran est un peu différent, car vous créez également un contexte de périphérique compatible pour cela.

Quant à vos questions:

1) Lorsque vous créez la fenêtre où vous voulez faire le rendu, vous prenez un contexte de périphérique et l'utiliser pour la durée de vie de cette fenêtre.

2) Vous devez toujours utiliser le contexte de périphérique créé pour la fenêtre dans laquelle vous effectuez le rendu.

+0

Super - Je pense que cela répond à ma question. Alors le contexte OpenGL sera à peu près associé au DC, n'est-ce pas? Je me souviens d'avoir lu qu'il n'y avait qu'un seul contexte par fil aussi. Je suppose donc que des fils différents auront aussi des DC différents? –

+0

Le problème de threading est différent - lorsque vous créez un contrôleur de domaine, vous devez toujours utiliser ce thread pour tous les appels dans ce contrôleur de domaine. En général, cela signifie un graphique/thread de rendu par contexte de périphérique (par exemple: par fenêtre). –

Questions connexes