Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi 7,OGL, куб с разными текстурами на гранях. 
:(
    Опции темы
zik3ak
Дата 23.3.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.12.2009

Репутация: нет
Всего: нет



Задачей было: Создать программу, представляющую собой куб(условно) с различными текстурами на каждой грани. Размер текстур нужен больше 1000*1000. Также должна быть возможность "осмотреть" куб. Камера должна находится внутри.

Код

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Textures, OpenGL, ExtCtrls;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure DrawScene;
    procedure InitializeRC;
    procedure SetDCPixelFormat;
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    RotZ,RotX,RotY,TransZ, //Координаты
    eyex, eyey, eyez,centerx, centery, // место в пространстве
    centerz, upx, upy, upz,            // камера
    TransX,TransY:GLDouble;
     ReturnM:boolean;//признаки прорисовки.
    protected
    procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  DC:HDC;
  HRC:HGLRC;
  arx,ary,arz:real;
  Up,Front,Back,Bottom,Right,Leva: glUInt;


implementation

uses Cub;

const
  // ???????? ??????
  MaterialColor: Array [0..6] of Glfloat = (1.0, 1.0, 1.0, 1.6, 1.0, 1.0, 1.0);

{$R *.dfm}

procedure Tform2.InitializeRC;// Иниц. света
begin
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
end;

procedure Tform2.SetDCPixelFormat; //формат пикселей
var
  nPixelFormat: Integer;
  pfd: TPixelFormatDescriptor;
begin
  FillChar(pfd, SizeOf(pfd), 0);
  with pfd do begin
    dwFlags   := PFD_DOUBLEBUFFER;
    cColorBits:= 32;
    cDepthBits:= 32;
  end;
  nPixelFormat := ChoosePixelFormat(DC, @pfd);
  SetPixelFormat(DC, nPixelFormat, @pfd);
end;

procedure Tform2.WMPaint(var Msg: TWMPaint);  // процедура перерисовки сцены
var
  ps : TPaintStruct;
begin
  BeginPaint(Handle, ps);
  DrawScene;
  EndPaint(Handle, ps);
end;


procedure TForm2.FormCreate(Sender: TObject);
begin
  // начальный поворот
 RotZ:=0;
 RotY:=45;
 RotX:=0;
  // начальное положение в пространстве
 TransZ:=0;
 TransX:=0;
 TransY:=0;
 ReturnM:=false;
DC := GetDC(Handle);
  SetDCPixelFormat;
  hrc := wglCreateContext(DC);
  wglMakeCurrent(DC, hrc);
  InitializeRC;
  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);
// Борьба с мерцанием
 If DC=0 then showMessage('ков');
 If hrc=0 then showMessage('ков-ков');
// Положение камеры
 glViewport(0, 0, ClientWidth, ClientHeight);
 glMatrixMode (GL_PROJECTION);
 glMatrixMode (GL_MODELVIEW);
 glLoadIdentity;
 eyex:=-0.5;eyey:=-0.5;eyez:=0.5;   //положениг глаз
 centerx:=0;centery:=0.7;centerz:=0;   //наблюдаемая точка
 upx:=0;upy:=1;upz:=0; //поворот камеры
end;

procedure Tform2.DrawScene;
begin
  // процедура рисования
  glClearColor (0.0, 0.5, 0.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  gluLookAt(eyex, eyey, eyez,centerx, centery, centerz, upx, upy, upz);
    GlPushMatrix;

  glRotate(RotZ,0,0,1);
  glRotate(RotY,0,1,0);
  glRotate(RotX,1,0,0);
  glTranslatef(0.0,0.0,0);
  glRotatef(0.0, 1.0, 0.0, 0.0);
// ----------------Куб с текстурами--------------------------
    LoadTexture('1.jpg',Front, FALSE);
    glEnable(GL_TEXTURE_2D);
   glBegin(GL_POLYGON);
// ----------------перед--------------------------
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
      glEnd();
// ----------------верх(???????)--------------------------
      LoadTexture('2.jpg',Up, FALSE);
   glBegin(GL_POLYGON);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0,  1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0,  1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
      glEnd();
// ----------------зад ????--------------------------
      LoadTexture('3.jpg',Back, FALSE);
   glBegin(GL_POLYGON);
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
      glEnd();
// ----------------низ(???)--------------------------
      LoadTexture('4.jpg',Bottom, FALSE);
   glBegin(GL_POLYGON);
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
      glEnd();
// ----------------права------------------------------
      LoadTexture('5.jpg',Right, FALSE);
    glBegin(GL_POLYGON);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
      glEnd();
// ----------------лева------------------------------
    LoadTexture('6.jpg',Leva, FALSE);
    glBegin(GL_POLYGON);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
      glEnd();
  SwapBuffers(DC);
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0,0);//обнуляем текущ. раоаметры
wglDeleteContext(HRC);//уничтожаем контекст
ReleaseDC(Handle,DC);{выпускаем контекст устройства}
DeleteDC(DC);//уничтожаем дескриптор
end;

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 form1.Close;
end;

procedure TForm2.FormResize(Sender: TObject);
begin
glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(30.0, Width / Height, 1.0, 10.0);
  glViewport(0, 0, Width, Height);
  glMatrixMode(GL_MODELVIEW);
  InvalidateRect(Handle, nil, False);
end;


procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
{поворот}
  case key of
    40: begin RotZ:=5+RotZ;end;{__dwn}
    38: begin RotZ:=-5+RotZ;end;{__up}
   //40: begin RotY:=5+RotY;end;{__right}
   //38: begin RotY:=-5+RotY;end;{__left}
   37:begin RotX:=5+RotX;end;{__right}
   39:begin RotX:=-5+RotX;end;{__left}
  else exit;
end;
{--------------------------------------------------------}
  InvalidateRect(Handle, nil, False);
end;

end.


Реализовал куб,  на который загружаются различные текстуры.[по путям, наверное, видно что они должны находиться в папке с проектом]
(в приложенном файле находится библиотека, которую использовал для загрузки текстур)
Поворот кривой(но лучшего не смог пока добиться).[в идеале должен быть мышкой. пытался.. вернее пытал куб. не получилось]
Проблема в АХХХ каких тормозах. Даже при текстурах 250*250 имею(условно) 1-2 fps.

Прошу помочь в ликвидации тормозов.(если возможно) Или в направлении разработки.(мб есть другой способ реализации этого?)
Выполнить я это должен именно в OGL, именно на Delphi.

Это сообщение отредактировал(а) zik3ak - 23.3.2010, 13:40

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  Textures.rar 292,50 Kb
PM MAIL ICQ   Вверх
Bitter
Дата 23.3.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



zik3ak, тормозит скорее всего, из-за того, что ты в каждом кадре вызываешь 6 раз LoadTexture. Зарузи их один раз при стартре и просто назначай их в каждом кадре.
PM MAIL ICQ Skype   Вверх
zik3ak
Дата 23.3.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.12.2009

Репутация: нет
Всего: нет



Bitter, т.е. задать переменные(для текстур) м... предположим в formcreate?
PM MAIL ICQ   Вверх
Bitter
Дата 23.3.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



ну да. Загружай в formcreate, а потом просто назначай текстуру перед выводом полигонов. 
Незнаю, правда, какой командой это делается в GL.
PM MAIL ICQ Skype   Вверх
zik3ak
Дата 23.3.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.12.2009

Репутация: нет
Всего: нет



Чёрт, как истинный(мб) программист напилсо пива. Извиняюсь, завтра буду штудрировать руководства. 
Также есть мысть создать среду постоянной нагрузки(т.е. чтобы постоянно обновлялось изображение.) следовательно присутствие FPS  и т д.
Там и отпределюсь.

Это сообщение отредактировал(а) zik3ak - 23.3.2010, 16:46
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1135 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.