Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
2-1203489060
Максим
2008-02-20 09:31
2008.03.23
разбор строка


2-1204001712
None
2008-02-26 07:55
2008.03.23
Ширина вертикальной прокрутки в Tscrollbox


6-1183210878
Kor
2007-06-30 17:41
2008.03.23
Обмен данными через Dial-up модем.


2-1203592121
Евгений Т.
2008-02-21 14:08
2008.03.23
Искать похожие слова


2-1203513538
..::KraN::..
2008-02-20 16:18
2008.03.23
Вставка картинки в Synedit