2010-02-20 4 views
3

J'installe ma fenêtre comme ceci:Delphi dessin OpenGL

glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 
glOrtho (0, form1.Width, form1.height, 0, 0, 1); 
glMatrixMode (GL_MODELVIEW); 
glDisable(GL_DEPTH_TEST); 

Et ma routine de dessin ressemble à ceci:

tempdist:=0.3/distance(i,0,1,2); 
xunit:=1 div 90; 
zunit:=1 div 74; 
glBegin(GL_LINE_LOOP); 
case players[i].isteam of 
2:glcolor3f(1.0,0.0,0.0); //Terrorist 
3:glcolor3f(0.0,0.0,1.0); //Counter-Terrorist 
end; 
glvertex2f((thetax/100)*xunit,(thetaz/100)*zunit); 
glvertex2f((thetax/100)*xunit+tempdist,(thetaz/100)*zunit); 
glvertex2f((thetax/100)*xunit+tempdist,(thetaz/100)*zunit+tempdist); 
glvertex2f((thetax/100)*xunit,(thetaz/100)*zunit+tempdist); 
glEnd(); 
SwapBuffers(wglGetCurrentDC); 

Aucun signe de dessin que ce soit. De l'aide?

Répondre

0

Comme nous ne savons pas quelle est la valeur de thetax est de votre code est-il possible que vous dessinez en dehors de la limite d'écrêtage?

Obtenir votre premier dessin avec OpenGL est souvent la moitié de la bataille. Je suggère d'aller à DelphiGL et de trouver un exemple qui est proche de ce que vous voulez et de travailler à partir de là. Le site est en allemand par défaut, mais il y a une traduction anglaise complète. En particulier, ils ont un ensemble utile de modèles par défaut.

0

Je ne sais pas, mais en comparant avec un code opengl j'ai fait il y a longtemps:

  • me manque la définition d'une fenêtre avec glViewport (0, 0, largeur, hauteur); // Définit la fenêtre d'affichage de la fenêtre OpenGL
  • Êtes-vous sûr que glortho prend des coordonnées de pixels (au lieu de coordonnées relatives à opengl?)
  • Quelle est la distance entre thetax et thetaz?

J'ai aussi utilisé d'une manière différente de la mise en place dc:

fdc:=getdc(<windowhandle of control we are displaying on >); 
FRC := wglCreateContext(FDC); 
b:=wglMakeCurrent(FDC, FRC); 

et pour finir

wglMakeCurrent(0, 0); 
wglDeleteContext(frc); 
0

Configuration du contexte est assez difficile correctement. Pour un contrôle réutilisable avec des performances décentes, vous aurez très probablement besoin d'un contrôle avec son propre CC, mais si vous pouvez en acquérir un à chaque fois que vous peignez, cela pourrait vous convenir.

Jetez un oeil à http://glscene.cvs.sourceforge.net/viewvc/glscene/Source/Platform/GLWin32Viewer.pas?view=log pour voir comment GLScene crée un contrôle utilisable avec OpenGL.

La partie clé de l'acquisition de son propre courant continu, est Redéfinition de la procédure CreateParams + ajoutant:

with Params do begin 
     Style:=Style or WS_CLIPCHILDREN or WS_CLIPSIBLINGS; 
     WindowClass.Style:=WindowClass.Style or CS_OWNDC; 
    end; 

Vous pouvez alors obtenir le DC à utiliser dans CreateWnd, et la libération dans DestroyWnd

Une fois que vous ve obtenu le DC, vous devez vous assurer que le PixelFormat prend en charge OpenGL + a les détails que vous voulez:

const pfd: PIXELFORMATDESCRIPTOR = (
    nSize: sizeof(PIXELFORMATDESCRIPTOR); 
    nVersion: 1;      // version 
    dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; 
    iPixelType: PFD_TYPE_RGBA; 
    cColorBits: 24;     // 24-bit color depth 
    cRedBits: 0; 
    cRedShift: 0; 
    cGreenBits: 0; 
    cGreenShift: 0; 
    cBlueBits: 0; 
    cBlueShift: 0; 
    cAlphaBits: 8;      // alpha bits 
    cAlphaShift: 0; 
    cAccumBits: 0;      // accumulation buffer 
    cAccumRedBits: 0; 
    cAccumGreenBits: 0; 
    cAccumBlueBits: 0; 
    cAccumAlphaBits: 0; 
    cDepthBits: 32;     // z-buffer 
    cStencilBits: 16;     // stencil buffer 
    cAuxBuffers: 0;     // auxiliary buffer 
    iLayerType: PFD_MAIN_PLANE;  // main layer 
    bReserved: 0; 
    dwLayerMask: 0; 
    dwVisibleMask: 0; 
    dwDamageMask: 0 
); 
var 
    pf: Integer; 
begin 
    pf := ChoosePixelFormat(dc, @pfd); 
    if not SetPixelFormat(dc, pf, @pfd) then 
    Assert(false);//failed, could retry with other settings 
    rc := wglCreateContext(dc); 
    if not wglMakeCurrent(dc, rc) then 
    Assert(false);// failed 
    // we should now have a rc so to test, we'll just clear 
    glClearColor(1, 0.5, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT); 
    // If we're double-buffered, then swap 
    SwapBuffers(dc); 
    wglMakeCurrent(0, 0); 

Une fois que vous avez fini d'utiliser le RC, vous devez également cl se lève en appelant wglDeleteContext.

Questions connexes