Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
15-1202578961
kiber-pilot
2008-02-09 20:42
2008.03.23
Список замен


15-1202689997
Petr V. Abramov
2008-02-11 03:33
2008.03.23
Хочешь узнать, что произошло в декабре 2007-го года в России? :))


15-1202736092
clickmaker
2008-02-11 16:21
2008.03.23
IContextMenu и AV


2-1203997892
Chorniy
2008-02-26 06:51
2008.03.23
Корректно ли делать так? WaitForSingleObject()


2-1203487534
snake-as
2008-02-20 09:05
2008.03.23
Работа с числами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский