Чертеж Delphi OpenGL

Я настраиваю свое окно следующим образом:

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

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


person Chris    schedule 20.02.2010    source источник


Ответы (3)


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

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

person Cruachan    schedule 20.02.2010

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

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

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

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

и закончить

 wglMakeCurrent(0, 0); 
 wglDeleteContext(frc);  
person Marco van de Voort    schedule 20.02.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.

person DanB    schedule 20.02.2010