OpenGl

0

Dlaczego to nie dziala do konca. Znaczy jak zamykam aplikacje to wyswietla mi sie blad:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Gl, Glu,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  g_HDC: HDC;
  hRC: HGLRC;
  haDC: HDC;
  width, height: integer;
  angle: float = 0.0;
implementation

{$R *.DFM}
procedure SetupPixelFormat(hDC:HDC);
var
 nPixelFormat: integer;
 pfd: PIXELFORMATDESCRIPTOR;
begin
 pfd.nSize       := SizeOf(PIXELFORMATDESCRIPTOR);
 pfd.nVersion    := 1;
 pfd.dwFlags     := PFD_DRAW_TO_WINDOW;
 pfd.dwFlags     := PFD_SUPPORT_OPENGl;
 pfd.dwFlags     := PFD_DOUBLEBUFFER;
 pfd.iPixelType  := PFD_TYPE_RGBA;
 pfd.cColorBits  := 32;
 pfd.cRedBits    := 0;
 pfd.cRedShift   := 0;
 pfd.cGreenBits  := 0;
 pfd.cGreenShift := 0;
 pfd.cBlueBits   := 0;
 pfd.cBlueShift  := 0;
 pfd.cAlphaBits  := 0;
 pfd.cAlphaShift := 0;
 pfd.cAccumBits  := 0;
 pfd.cAccumRedBits:= 0;
 pfd.cAccumGreenBits:= 0;
 pfd.cAccumBlueBits:= 0;
 pfd.cAccumAlphaBits:=0;
 pfd.cDepthBits  :=16;
 pfd.cStencilBits:= 0;
 pfd.cAuxBuffers :=0;
 pfd.iLayerType  := PFD_MAIN_PLANE;
 pfd.bReserved   := 0;
 pfd.dwLayerMask := 0;
 pfd.dwVisibleMask:=0;
 pfd.dwDamageMask:=0;

 nPixelFormat:= ChoosePixelFormat(hdc, @pfd);
 SetPixelFormat(hDC,nPixelFormat,@pfd);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 haDC:= GetDC(form1.Handle);
 g_HDC:= haDC;
 SetupPixelFormat(haDC);

 hRC:= wglCreateContext(haDC);
 wglMakeCurrent(haDC, hRC);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 wglMakeCurrent(haDC, null);
 wglDeleteContext(hRC);
 ReleaseDC(Form1.Handle,haDC);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
height:= form1.Height;
width := form1.Width;
if height=0 then form1.height:=1;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,width/height,1.0,1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for I:=0 to 200 do
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
angle := angle + 0.1;
glTranslatef(0.0,0.0,-5.0);
glRotatef(angle,0.0,0.0,1.0);

glColor3f(1.0,0.0,0.0);
glBegin(GL_TRIANGLES);
 glVertex3f(0.0,0.0,0.0);
 glVertex3f(1.0,0.0,0.0);
 glVertex3f(1.0,1.0,0.0);
glEnd();
SwapBuffers(g_HDC);
end;
end;

end.
0

nie pomoze nikt ?

0

Moge tylko podpowiedzieć: w kilku początkowych tutorialach (włąsnie o OpenGL) ze strony http://nehe.gamedev.net/ ten błąd nie wystepował, dopiero w pozniejszych lekcjach zaczał wyskakiwać (ale w wersji C++ go nie było ani w poznieszych ani we wczesniejszych tutorialach) - przeanalizuj obie wersje, porównaj, może do czegos dojdziesz.

0

Usuń wglMakeCurrent z OnClose.
U mnie bez tego zamykało się OK...

1 użytkowników online, w tym zalogowanych: 0, gości: 1