![]() |
|
|
#1
|
|||
|
|||
|
Программа запускается, никаких ошибок не выдает, но ничего не отображается. Может чего то не хватает? Помогите плиз.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, OpenGL;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
DC:HDC; // переменные для получения контекста воспроизведения
hrc:HGLRC; //
Angle:GLfloat; // угол, на который будет поворачиваться куб
procedure Initsvet;
procedure SetPixFormat;// формат пукселя
procedure WMPaint( var Msg: TWMPaint );// похожа на OnPaint
message WM_PAINT; // сообщение от OnPaint
public
{ Public declarations }
end;
const
MaterialColor: Array [0..3] of GLfloat = (0.3, 0.4, 1.0, 1.0);
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Angle := 0;
DC := GetDC(Handle); // получить окно
SetPixFormat; // установим формат пикселя
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc); // сделаем "текущим контекст воспроизведения
Initsvet; // включим свет
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE , @MaterialColor);
glMatrixMode(GL_MODELVIEW);
Timer1.Enabled := True; // включим таймер
GLShadeModel(GL_SMOOTH);
end;
procedure TForm1.initsvet; // СВЕТ //
const
fogColor: array[0..3] of GLfloat = (0.7, 0.7, 0.7, 2.0);
var
fogMode : GLint;
begin
glEnable(GL_DEPTH_TEST); // разрешить тест глубины
glEnable(GL_LIGHTING); // разрешить освещённость
glEnable(GL_LIGHT0); // включить нулевую лампу
end;
procedure TForm1.SetPixFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
with pfd do
begin
nSize := sizeof(pfd);
nVersion := 1;
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
iPixelType:= PFD_TYPE_RGBA;
cColorBits:= 24;
cDepthBits:= 32;
iLayerType:= PFD_MAIN_PLANE;
end;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
procedure TForm1.WMPaint(var Msg: TWMPaint);
var
quadObj : gluQuadricObj;
begin
quadObj := gluNewQuadric;//новый объект
glRotate(5.0, 0.0, 1.0, 0.0);//повернём
glPushMatrix;//перейдём к новым координатам, сохранив старые
glRotated(-90,1.0,0.0,0.0);//ещё раз повернём
gluSphere(quadObj,1.3,20,20);//а теперь нарисуем сферу "1.3 - радиус",
// а 20 и 20 - это колличество разбиений
glPopMatrix;//перейдём к старым координатам
gluDeleteQuadric(quadObj);//эта функция сделает "чёрную" работу
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glMatrixMode(GL_PROJECTION); // модель матрицы проекционная
glLoadIdentity; // загрузить матрицу
gluPerspective(60.0, Width / Height, 1.0, 10.0);
glViewport(0, 0, Width, Height); // область вывода весь экран
glMatrixMode(GL_MODELVIEW); // модель матрицы перспективная
InvalidateRect(Handle, nil, False); // перерисовать всё окно
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Timer1.Enabled := False;
wglMakeCurrent(0, 0); // сделать контекст "текущим"
wglDeleteContext(hrc); // удалить контекст воспроизведения
ReleaseDC(Handle, DC); // удалить окно
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Angle := Angle + 1.0; // увеличиваем угол
If (Angle >= 360.0) then Angle := 0.0; // если совершён полный оборот, то вернуть в 0
InvalidateRect(Handle, nil, False); // перерисовать окно
end;
end. |
|
#2
|
|||
|
|||
|
Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin Angle := Angle + 1.0; // увеличиваем угол If (Angle >= 360.0) then Angle := 0.0; // если совершён полный оборот, то вернуть в 0 InvalidateRect(Handle, nil, False); // не уверен, что нужно SwapBuffers(DC); end; .Последний раз редактировалось DungeonLords, 21.12.2009 в 21:28. |
|
#3
|
|||
|
|||
|
Цитата:
Имеется ввиду, что таймер вобще не нужен или только выделенная строка? |
|
#4
|
|||
|
|||
|
Цитата:
2) посмотри, если всё будет ok, удали InvalidateRect и посмотри что будет. |
|
#5
|
|||
|
|||
|
Цитата:
SwapBuffers добавил. InvalidateRect и удалял и возвращал обратно. Все равно не отображает. |
|
#6
|
|||
|
|||
|
Цитата:
|
|
#7
|
|||
|
|||
|
Вот тебе код, работающий однозначно. На его основе найди ошибку сам, это твоё "домашние задание":
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
DC:HDC; // переменные для получения контекста воспроизведения
hrc:HGLRC; //
procedure SetPixFormat;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.SetPixFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
with pfd do
begin
nSize := sizeof(pfd);
nVersion := 1;
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
iPixelType:= PFD_TYPE_RGBA;
cColorBits:= 24;
cDepthBits:= 32;
iLayerType:= PFD_MAIN_PLANE;
end;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle); // получить окно
SetPixFormat; // установим формат пикселя
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc); // сделаем "текущим контекст воспроизведения
glMatrixMode(GL_MODELVIEW);
Timer1.Enabled := True; // включим таймер
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Команды ниже должен знать как свои 5 пальцев!
glBegin(GL_TRIANGLES);
glColor3f(1.0,0.0,0.0);
glVertex3f(0,0,0);
glColor3f(1.0,1.0,0.0);
glVertex3f(500,0,0);
glColor3f(1,0,0);
glVertex3f(250,500,0);
glEnd;
SwapBuffers(DC);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Timer1.Enabled := False;
wglMakeCurrent(0, 0); // сделать контекст "текущим"
wglDeleteContext(hrc); // удалить контекст воспроизведения
ReleaseDC(Handle, DC); // удалить окно
end;
end.Последний раз редактировалось DungeonLords, 21.12.2009 в 22:04. |
|
#8
|
|||
|
|||
|
Ага, кое что я уже нашел. То что у меня в private нужно перенести в public, а процедуры походу и прописывать не надо. procedure TForm1.GLInit; этоя так понял включает свет и цвет объекта.
|
|
#9
|
|||
|
|||
|
Проблема частичьно решена. Таймер убрал полностью и все что с ни связвно. SwapBuffers(DC) перенес в конец процедуры WMPaint. Получилась жуть. Правда изменил радиус. И еще, при запуске этого же экзешника, показывает что угодно, но не сферу.
![]() |
|
#10
|
|||
|
|||
|
Цитата:
А GLInit м... я её удалил уже вчера. Цитата:
Плюс посмотри на это: procedure TForm1.WMPaint(var Msg: TWMPaint); var quadObj : gluQuadricObj; begin quadObj := gluNewQuadric;//новый объект glRotate(5.0, 0.0, 1.0, 0.0);//повернём glPushMatrix;//перейдём к новым координатам, сохранив старые glRotated(-90,1.0,0.0,0.0);//ещё раз повернём gluSphere(quadObj,1.3,20,20);//а теперь нарисуем сферу "1.3 - радиус", // а 20 и 20 - это колличество разбиений glPopMatrix;//перейдём к старым координатам gluDeleteQuadric(quadObj);//эта функция сделает "чёрную" работу end; Ага, "повернём" . Да так повернём, что потом все объекты будут поворачиваться т.к. сначало нужно запомнить текущую матрицу трансформации функцией glPushMatrix. И ещё раз повторяю, верни таймер на место!Есть у меня одна хорошая для тебя демка: http://rapidshare.de/files/48877305/gl_demo.rar.html [только учти (!), там не включай "FBO текстуру", а то просто зависнит, я там с ней неправильно работал] Последний раз редактировалось DungeonLords, 22.12.2009 в 16:36. |
|
#11
|
|||
|
|||
|
Т.е. glRotate(5.0, 0.0, 1.0, 0.0); надо поставить после glPushMatrix. Этот пример я взял из DRKB. А книгу эту я уже скачал, там есть примеры, но все равно вопросы есть. Я пробовал вчера использовать Paint, после чего любой экзешник подобных примеров свызанный с OpenGL(например куб) показывал твой пример.
|
|
#12
|
|||
|
|||
|
Цитата:
это то, что "русская база знаний по Delphi"? Ну они, может быть и авторитестны в какой-то мере, но я тебе скинул пример, там никакий WNPaint, я корректор GLScene (это OpenGL надстройка) и там опять никакого WNPaint. Не веришь, заведи тему здесь: http://www.gamedev.ru/ или здесь: www.glscene.ru .Цитата:
|
|
#13
|
|||
|
|||
|
Цитата:
Про экзешник, ладно фиг с ним. Paint я имел ввиду во вкладке Events событие OnPaint. Выше перечисленные ссылки обязательно посмотрю. Последний раз редактировалось T_N_W, 25.12.2009 в 12:42. |