Delphi OpenGL Drawing - PullRequest
       60

Delphi OpenGL Drawing

3 голосов
/ 20 февраля 2010

Я настраиваю свое окно так:

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

А моя процедура рисования выглядит следующим образом:

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);

Никаких признаков рисования вообще. Любая помощь?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2010

Не знаю, но, сравнивая с некоторым кодом opengl, я сделал давно:

  • Мне не хватает определения области просмотра с помощью glViewport (0, 0, Ширина, Высота); // Установить область просмотра для окна OpenGL
  • Вы уверены, что glortho принимает координаты пикселей (вместо относительных координат opengl?)
  • В каком диапазоне находятся thetax и thetaz?

Я также использовал другой способ настройки dc:

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

и до конца

 wglMakeCurrent(0, 0); 
 wglDeleteContext(frc);  
0 голосов
/ 21 февраля 2010

Правильно настроить контекст довольно сложно.

Для многократно используемого элемента управления с достойной производительностью вам, скорее всего, понадобится элемент управления с собственным DC, но если вы сможете приобретать его каждый раз, когда рисуете, с вами все будет в порядке.

Взгляните на http://glscene.cvs.sourceforge.net/viewvc/glscene/Source/Platform/GLWin32Viewer.pas?view=log, чтобы увидеть, как GLScene создает элемент управления, который можно использовать с OpenGL.

Ключевым моментом при получении собственного DC является переопределение процедуры CreateParams + добавление:

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

Затем вы можете получить DC для использования в CreateWnd и выпустить в DestroyWnd

Как только вы получите DC, вам нужно убедиться, что PixelFormat поддерживает OpenGL + содержит необходимую информацию:

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);

После того, как вы закончили использовать RC, вы также должны очиститься, вызвав wglDeleteContext.

0 голосов
/ 20 февраля 2010

Поскольку мы не знаем, каково значение thetax из вашего кода, возможно, вы рисуете вне границы отсечения?

Получение вашего первого чертежа с OpenGL довольно часто является полдела. Я бы предложил перейти на DelphiGL и найти пример, близкий к тому, что вы хотите, и оттуда работать. По умолчанию сайт на немецком языке, но есть обширный перевод на английский. В частности, у них есть полезный набор шаблонов по умолчанию.

...