3

我正在像这样设置我的窗口:

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

没有任何绘画的迹象。有什么帮助吗?

4

3 回答 3

0

由于我们不知道您的代码中thetax的值是多少,您是否有可能在剪切边界之外进行绘制?

使用 OpenGL 进行第一次绘图通常是成功的一半。我建议去DelphiGL并找到一个接近你想要的例子并从那里开始工作。该网站默认为德语,但有大量英文翻译。特别是他们有一组有用的默认模板。

于 2010-02-20T18:06:49.957 回答
0

正确设置上下文非常困难。

对于具有良好性能的可重复使用的控件,您很可能想要一个具有自己的 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 进行清理。

于 2010-02-20T22:31:35.660 回答
0

我不知道,但是在与我很久以前制作的一些 opengl 代码进行比较时:

  • 我想念用 glViewport(0, 0, Width, Height); 定义视口;// 设置 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);  
于 2010-02-20T19:56:56.227 回答