Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.12.2009, 15:44
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию Неотображает ((

Программа запускается, никаких ошибок не выдает, но ничего не отображается. Может чего то не хватает? Помогите плиз.

Код:
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  
Старый 21.12.2009, 21:24
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Код:
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;
Ух, как я давно уже не видел чистого OpenGL кода, как увидел твой пост так и просиял .
__________________
Делаем'c разные игры. Искать на glscene.ru

Последний раз редактировалось DungeonLords, 21.12.2009 в 21:28.
Ответить с цитированием
  #3  
Старый 21.12.2009, 21:30
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от DungeonLords
Код:
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;
Ух, как я давно уже не видел чистого OpenGL кода, как увидел твой пост так и просиял .

Имеется ввиду, что таймер вобще не нужен или только выделенная строка?
Ответить с цитированием
  #4  
Старый 21.12.2009, 21:36
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Цитата:
Сообщение от T_N_W
Имеется ввиду, что таймер вобще не нужен или только выделенная строка?
1) добавь SwapBuffers...
2) посмотри, если всё будет ok, удали InvalidateRect и посмотри что будет.
__________________
Делаем'c разные игры. Искать на glscene.ru
Ответить с цитированием
  #5  
Старый 21.12.2009, 21:43
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от DungeonLords
1) добавь SwapBuffers...
2) посмотри, если всё будет ok, удали InvalidateRect и посмотри что будет.

SwapBuffers добавил.
InvalidateRect и удалял и возвращал обратно. Все равно не отображает.
Ответить с цитированием
  #6  
Старый 21.12.2009, 21:53
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Цитата:
Сообщение от T_N_W
SwapBuffers добавил.
InvalidateRect и удалял и возвращал обратно. Все равно не отображает.
Ну SwapBuffers однозначно нужен, а почему не отображает, м... сейчас подумаю, оставайтесь на связи.
__________________
Делаем'c разные игры. Искать на glscene.ru
Ответить с цитированием
  #7  
Старый 21.12.2009, 22:01
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Вот тебе код, работающий однозначно. На его основе найди ошибку сам, это твоё "домашние задание":
Код:
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.
Кстати, забудь о TForm1.WMPaint и не используй его, это совсем не для OpenGL.
__________________
Делаем'c разные игры. Искать на glscene.ru

Последний раз редактировалось DungeonLords, 21.12.2009 в 22:04.
Ответить с цитированием
  #8  
Старый 21.12.2009, 22:18
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию

Ага, кое что я уже нашел. То что у меня в private нужно перенести в public, а процедуры походу и прописывать не надо. procedure TForm1.GLInit; этоя так понял включает свет и цвет объекта.
Ответить с цитированием
  #9  
Старый 22.12.2009, 16:11
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию

Проблема частичьно решена. Таймер убрал полностью и все что с ни связвно. SwapBuffers(DC) перенес в конец процедуры WMPaint. Получилась жуть. Правда изменил радиус. И еще, при запуске этого же экзешника, показывает что угодно, но не сферу.
Изображения
Тип файла: jpg Безымянный.JPG (76.5 Кбайт, 7 просмотров)
Ответить с цитированием
  #10  
Старый 22.12.2009, 16:24
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Цитата:
Сообщение от T_N_W
Ага, кое что я уже нашел. То что у меня в private нужно перенести в public, а процедуры походу и прописывать не надо. procedure TForm1.GLInit; этоя так понял включает свет и цвет объекта.
Блин, я ввёл тебя в заблуждение. В реальности можно это запихнуть и в public и в private и вообще в глобальную переменную: ничего не изменится.

А GLInit м... я её удалил уже вчера.

Цитата:
Сообщение от T_N_W
Проблема частичьно решена. Таймер убрал полностью и все что с ни связвно. SwapBuffers(DC) перенес в конец процедуры WMPaint.
А вот это точно твоя ошибка! Верни таймер и зубудь про WMPaint. Вот есть книга именно о OpenGL в Delphi: http://c-books.info/books/load.php?ty=delphi

Плюс посмотри на это:
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 текстуру", а то просто зависнит, я там с ней неправильно работал]
__________________
Делаем'c разные игры. Искать на glscene.ru

Последний раз редактировалось DungeonLords, 22.12.2009 в 16:36.
Ответить с цитированием
  #11  
Старый 22.12.2009, 16:48
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию

Т.е. glRotate(5.0, 0.0, 1.0, 0.0); надо поставить после glPushMatrix. Этот пример я взял из DRKB. А книгу эту я уже скачал, там есть примеры, но все равно вопросы есть. Я пробовал вчера использовать Paint, после чего любой экзешник подобных примеров свызанный с OpenGL(например куб) показывал твой пример.
Ответить с цитированием
  #12  
Старый 22.12.2009, 23:08
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
Стрелка Учись.

Цитата:
Сообщение от T_N_W
Этот пример я взял из DRKB. А книгу эту я уже скачал, там есть примеры, но все равно вопросы есть. Я пробовал вчера использовать Paint, после чего любой экзешник подобных примеров свызанный с OpenGL(например куб) показывал твой пример.
Э... Ты грамотно пиши, ладно? Я не понял что ты хотел сказать: какой экзешник? зачем Paint[это ведь стандартная windows программа рисования изображений или ты хотел сказать WMPaint?]. DRKB это то, что "русская база знаний по Delphi"? Ну они, может быть и авторитестны в какой-то мере, но я тебе скинул пример, там никакий WNPaint, я корректор GLScene (это OpenGL надстройка) и там опять никакого WNPaint. Не веришь, заведи тему здесь: http://www.gamedev.ru/ или здесь: www.glscene.ru .

Цитата:
Сообщение от T_N_W
Т.е. glRotate(5.0, 0.0, 1.0, 0.0); надо поставить после glPushMatrix.
В яблочко!
__________________
Делаем'c разные игры. Искать на glscene.ru
Ответить с цитированием
  #13  
Старый 22.12.2009, 23:19
T_N_W T_N_W вне форума
Прохожий
 
Регистрация: 21.12.2009
Сообщения: 18
Репутация: 10
По умолчанию

Цитата:
Сообщение от DungeonLords
Э... Ты грамотно пиши, ладно? Я не понял что ты хотел сказать: какой экзешник? зачем Paint[это ведь стандартная windows программа рисования изображений или ты хотел сказать WMPaint?]. DRKB это то, что "русская база знаний по Delphi"? Ну они, может быть и авторитестны в какой-то мере, но я тебе скинул пример, там никакий WNPaint, я корректор GLScene (это OpenGL надстройка) и там опять никакого WNPaint. Не веришь, заведи тему здесь: http://www.gamedev.ru/ или здесь: www.glscene.ru .


В яблочко!

Про экзешник, ладно фиг с ним.
Paint я имел ввиду во вкладке Events событие OnPaint.

Выше перечисленные ссылки обязательно посмотрю.

Последний раз редактировалось T_N_W, 25.12.2009 в 12:42.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter