2010-02-20 79 views
3

我我的窗口设置是这样的:德尔福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); 

任何绘画的迹象。任何帮助?

回答

0

由于我们不知道thetax的值是否来自您的代码,因此您可能在裁剪边界之外绘图?

通过OpenGL进行第一次绘制往往是战斗的一半。我建议去DelphiGL并找到一个接近你想要的并且从那里工作的例子。该网站默认为德语,但有大量的英文翻译。特别是他们有一套有用​​的默认模板。

0

我不知道,但在一些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

设置上下文正确是挺难的。

对于具有良好性能的可重复使用的控制,您很可能需要使用自己的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完成后,你也应该CL通过调用wglDeleteContext调用。