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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.07.2007, 18:27
stalker_2000 stalker_2000 вне форума
Прохожий
 
Регистрация: 09.07.2007
Сообщения: 2
Репутация: 10
Вопрос OpenGL программа, проблема при закрытии

Значитцца, имеецца такой код
Код:
unit m_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, MPlayer, StdCtrls, jpeg, OpenGL;

type
  Tw_main = class(TForm)
    w_main_button_turn: TButton;
    w_statistic: TGroupBox;
    Panel1 : TPanel;
    MainMenu1 : TMainMenu;
    MediaPlayer1 : TMediaPlayer;
    cube1 : TImage;
    cube2 : TImage;
    Label1: TLabel;
    Panel2: TPanel;
    Timer1: TTimer;
    Label3: TLabel;
    Label4: TLabel;
    procedure menu_aboutClick(Sender: TObject);
    procedure menu_exitClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure w_main_button_turnClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure menu_newClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private { Private declarations }
    hrc: HGLRC; // êîíòåêñò âîñïðîèçâåäåíèÿ OpenGL
    dc : HDC;
    tex_logo  : array[1..512*512*3] of Byte;
  public  { Public declarations }
    ntex_logo : GLuint;
  end;

procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(Target: GLEnum; Texture: GLuInt); stdcall; external opengl32;

var w_main: Tw_main;
//---------------------------------------------------------------------------
implementation
{$R *.dfm}
...
//---------------------------------------------------------------------------
procedure Tw_main.menu_exitClick(Sender: TObject);
begin
  Halt;
end;
//---------------------------------------------------------------------------
...
//---------------------------------------------------------------------------
procedure Tw_main.FormCreate(Sender: TObject);
begin
  randomize;
  dc:=GetDC(Panel2.Handle);
  SetDCPixelFormat(dc);
  hrc:=wglCreateContext(dc);
  wglMakeCurrent(DC,hrc);

  glClearColor(0,0,0,0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_TEXTURE_2D);
  glGenTextures(2,ntex_logo);
  rgb_load('default\logo.res',512*512*3,tex_logo);  glBindTexture(GL_TEXTURE_2D,ntex_logo);
glTexImage2D(GL_TEXTURE_2D,0,3,512,512,0,GL_RGB,GL_UNSIGNED_BYTE,@tex_logo);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
end;
//---------------------------------------------------------------------------
procedure Tw_main.FormPaint(Sender: TObject);
var
  ps : TPaintStruct;
begin
BeginPaint(Panel2.Handle,ps);
wglMakeCurrent(dc,hrc);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glRotate(5,1,0,1);
  glBindTexture(GL_TEXTURE_2D,ntex_logo);
  glBegin(GL_QUADS);
    glVertex2d(-1,-1); glTexCoord2d(0,0);
    glVertex2d(-1,1);  glTexCoord2d(1,0);
    glVertex2d(1,1);   glTexCoord2d(1,1);
    glVertex2d(1,-1);  glTexCoord2d(0,1);
  glEnd;
wglMakeCurrent(dc,0);
EndPaint(Panel2.Handle,ps);
end;
//---------------------------------------------------------------------------
...
//---------------------------------------------------------------------------
procedure Tw_main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  wglMakeCurrent(0,0);
  wglDeleteContext(hrc);
  ReleaseDC(Handle,DC);
end;
//---------------------------------------------------------------------------
procedure Tw_main.Timer1Timer(Sender: TObject);
begin
  w_main.Repaint;
end;
//---------------------------------------------------------------------------
end.

всё нормально работает, а когда я давлю закрыть или через менюшку - выйти, появляется ошибка
Код:
Project 111 raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped.  Use Step or Run to continue.
Выяснил, что ошибка появляется из-за объявления функций
Код:
procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(Target: GLEnum; Texture: GLuInt); stdcall; external opengl32;
Но без них никак...
Исправьте моё ДНК, плз

Последний раз редактировалось stalker_2000, 09.07.2007 в 19:05.
Ответить с цитированием
  #2  
Старый 10.07.2007, 12:25
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Можно попробовать в FormClose остановить таймер (Timer1.Enabled:= false;)
Ответить с цитированием
  #3  
Старый 11.07.2007, 23:53
stalker_2000 stalker_2000 вне форума
Прохожий
 
Регистрация: 09.07.2007
Сообщения: 2
Репутация: 10
По умолчанию

Ставил, не то это всё.

Нашел ошибку, как обычно глупая и досадная ))
Код:
glGenTextures(2,@ntex_logo);
Означает "сделай мне 2 текстуры и помести идентификаторы в ntex_logo. Проблема в том, что текстуры я зачем-то задал 2, в одну переменную. Т.е. надо либо 1 текстура=1 переменная, либо много текстур = массив.

Всем спасибо за внимание
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter