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

わかりませんが、ずっと前に作成したいくつかの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 に答える
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 に答える