2010-08-09 7 views
2

Je suis occupé à gravir la courbe d'apprentissage pour OpenGL, en utilisant Delphi (pascal); J'utilise un excellent texte, mais chaque exemple dans le livre attire toute la forme. Je veux placer un composant d'image sur le et dessiner à cela. J'ai essayé d'affecter le handle de contexte de périphérique (GDC) au handle du canevas du contrôle d'image, plutôt qu'à l'handle du formulaire, mais cela renvoie une erreur lorsque ChoosePixelFormat est appelée. Donc, si quelqu'un sait comment faire se produire cela, j'apprécierais toutes les suggestions.OpenGL: comment limiter à un composant d'image?

Merci d'avance pour toute aide.

jrDoner

Répondre

5

J'utilise toujours le code suivant pour configurer la fenêtre HWND pour la sortie OpenGL:

procedure rglSetupGL(Handle: HWnd); 
var 
    DC: HDC; 
    PixelFormat: integer; 
const 
    PFD: TPixelFormatDescriptor = (
     nSize: sizeOf(TPixelFormatDescriptor); 
     nVersion: 1; 
     dwFlags: PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; 
     iPixelType: PFD_TYPE_RGBA; 
     cColorBits: 24; 
     cRedBits: 0; 
     cRedShift: 0; 
     cGreenBits: 0; 
     cGreenShift: 0; 
     cBlueBits: 0; 
     cBlueShift: 0; 
     cAlphaBits: 24; 
     cAlphaShift: 0; 
     cAccumBits: 0; 
     cAccumRedBits: 0; 
     cAccumGreenBits: 0; 
     cAccumBlueBits: 0; 
     cAccumAlphaBits: 0; 
     cDepthBits: 16; 
     cStencilBits: 0; 
     cAuxBuffers: 0; 
     iLayerType: PFD_MAIN_PLANE; 
     bReserved: 0; 
     dwLayerMask: 0; 
     dwVisibleMask: 0; 
     dwDamageMask: 0); 
begin 
    DC := GetDC(Handle); 
    PixelFormat := ChoosePixelFormat(DC, @PFD); 
    SetPixelFormat(DC, PixelFormat, @PFD); 
    RC := wglCreateContext(DC); 
    wglMakeCurrent(DC, RC); 
end; 

Comme vous le savez, il y a une énorme différence entre les poignées de fenêtre (de HWNDs (?)) et les contextes de périphériques (DC). Chaque fenêtre a un HWND, et chaque fenêtre que vous pouvez dessiner a un HDC. Étant donné une forme, Handle est son HWND, et Canvas.Handle est son HDC. Pour obtenir le CC associé à une fenêtre, vous pouvez utiliser GetDC(HWND).

Vous devez configurer OpenGL sur une fenêtre, c'est-à-dire sur un HWND. Vous ne pouvez donc pas rendre OpenGL sur un contrôle sans un handle de fenêtre, tel qu'un TImage. Utilisez un TPanel ou un autre abonné de TWinControl.

+0

+1 pour la bonne explication. J'ai en fait un composant VCL que j'ai écrit qui configure un contexte OpenGL dans un formulaire. Il est conçu pour faire plus que cela - il ne s'agit pas seulement d'OpenGL, mais d'une interface avec la bibliothèque multimédia SDL utilisant un backend OpenGL - mais il fournit un vrai contexte GL sur lequel vous pouvez utiliser des routines OpenGL standard. Si quelqu'un est intéressé je pourrais le rendre disponible pour les gens à utiliser ... –

Questions connexes