Форум: "Media";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
ВнизOpenGL Найти похожие ветки
← →
Nikss (2007-04-30 18:55) [0]Здравствуйте! Пытаюсь создать простейшую программку в OpenGL, но не могу понять, что неправильно. Я объявляю процедуры FormCreate, FormPaint, FormResize, FormDestroy, как описано в справочнике, но когда появляется форма, она пустая, и на ней ничего не появляется, а мне нужно, чтобы там сразу были объекты. Скажите, пожалуйста, как это сделать? На всякий случай листинг:
unit GL;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
ghRC:HGLRC;
ghDC:HDC;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function bSetupPixelFormat(DC:HDC):boolean;
var
pfd:PIXELFORMATDESCRIPTOR;
ppfd:PPIXELFORMATDESCRIPTOR;
pixelformat:integer;
begin
ppfd := @pfd;
ppfd.nSize := sizeof(PIXELFORMATDESCRIPTOR);
ppfd.nVersion := 1;
ppfd.dwFlags := PFD_DRAW_TO_WINDOW xor
PFD_SUPPORT_OPENGL xor
PFD_DOUBLEBUFFER;
ppfd.dwLayerMask := PFD_MAIN_PLANE;
ppfd.iPixelType := PFD_TYPE_RGBA;
ppfd.cColorBits := 16;
ppfd.cDepthBits := 16;
ppfd.cAccumBits := 0;
ppfd.cStencilBits := 0;
pixelformat := ChoosePixelFormat(dc, ppfd);
if pixelformat=0 then
begin
MessageBox(0, "ChoosePixelFormat failed", "Error", MB_OK);
bSetupPixelFormat:=FALSE;
exit;
end;
if SetPixelFormat(dc, pixelformat, ppfd)=false then
begin
MessageBox(0, "SetPixelFormat failed", "Error", MB_OK);
bSetupPixelFormat:=FALSE;
exit;
end;
bSetupPixelFormat:=TRUE;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
p: TGLArrayf4;
d: TGLArrayf3;
begin
WindowState:=wsMaximized;
ghDC := GetDC(Handle);
if bSetupPixelFormat(ghDC)=false then
Close();
ghRC := wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);
glClearColor(0.0, 0.0, 0.0, 0.0);
FormResize(Sender);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
p[0]:=3;
p[1]:=3;
p[2]:=3;
p[3]:=1;
d[0]:=-1;
d[1]:=-1;
d[2]:=-3;
glLightfv(GL_LIGHT0,GL_POSITION,@p);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@d);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport( 0, 0, Width, Height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt(0,0,5, 0,0,0, 0,1,0);
glMatrixMode( GL_MODELVIEW );
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ghRC<>0 then
begin
wglMakeCurrent(ghDC,0);
wglDeleteContext(ghRC);
end;
if ghDC<>0 then
ReleaseDC(Handle, ghDC);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
wglMakeCurrent(Canvas.Handle,ghrc);
glClearColor(0.5, 0.5, 0.7, 1.0);
glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT);
glBegin ( GL_QUADS );
glNormal3f ( 0.0 , 0.0 , -1.0 );
glVertex3f ( 1.0 , 1.0 , 1.0 );
glVertex3f ( -1.0 , 1.0 , 1.0 );
glVertex3f ( -1.0 , -1.0 , 1.0 );
glVertex3f ( 1.0 , -1.0 , 1.0 );
glEnd;
glBegin ( GL_QUADS );
glNormal3f ( 1.0 , 0.0 , 0.0 );
glVertex3f ( -1.0 , 1.0 , 1.0 );
glVertex3f ( -1.0 , 1.0 , -1.0 );
glVertex3f ( -1.0 , -1.0 , -1.0 );
glVertex3f ( -1.0 , -1.0 , 1.0 );
glEnd;
glBegin ( GL_QUADS );
glNormal3f ( 0.0 , -1.0 , 0.0 );
glVertex3f ( -1.0 , 1.0 , -1.0 );
glVertex3f ( -1.0 , 1.0 , 1.0 );
glVertex3f ( 1.0 , 1.0 , 1.0 );
glVertex3f ( 1.0 , 1.0 , -1.0 );
glEnd;
wglMakeCurrent(0,0);
end;
end.
← →
Чародей © (2007-04-30 20:35) [1]
> Я объявляю процедуры FormCreate, FormPaint, FormResize,
> FormDestroy, как описано в справочнике
Если объявляешь процедуры вручную то в окошке Events надо выставить связки событий с процедурами, а лучше сразу создавать их от туда(dblClick! :)
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c