Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопросы по OpenGL [Delphi, Windows]


Страницы:   1 2 3 4 5 6

Pa5ha ©   (2005-04-01 00:20:00) 

Решил написать небольшой симулятор на ОпенГЛ и столкнулся с некоторыми тонкостями.

1. скайбокс из-за интерполяции имеет стыки, которые всё сильно портят. Как их можео убрать?
2. как удалять текстуры имея только GLUint? Просто, сцены надо менять по ходу дела, а старые текстуры не удаляются до завершения (и удаляются ли вообще).

Вопросы будут поступать ещё скорее всего =)


Pa5ha   (2005-04-15 23:04:00) [41]

Итак, пришло время по-тохому пытаться написать что то типа игры. Как это сделать???

Как грамотно оганизовать работу с LOD?
Переднюю и заднюю плоскости отсечения (ну или как из там) надо задавать только для сцены целиком?


XProger   (2005-04-15 19:40:00) [42]

Pa5ha, xglGamma_Set(xglGamma_def) всегда выполняется успешно ;)
Я класс окна не убиваю, и ничего ужасного не происходит... :D


Pa5ha   (2005-04-15 17:10:00) [43]

XProger, После DestroyWindow надо вызывать UnregisterClass. Или нет? У меня все точно так же. В общем, незнаю. Буду искать багу.

В функции возврата гаммы лучше сначала вызвать xglGamma_Set(xglGamma_def);
, а потом написать в лог, что операция выполнена успешно :)


XProger   (2005-04-15 13:19:00) [44]

cyborg,
Функция требует var переменную (указатели в C++)
Ты даёшь ей переменную, которая по сути нильная. Функция видит что ей подали nil и возвращает видео режим на тот что прописан в реестре.

Pa5ha,
Вот тебе код из моего движка который 100% работает (проверено ;)

procedure xglClose; stdcall;
begin
Log(' ');
Log('---- R_Close ----');
Log('Shutting down OpenGL subsystem');
if not inWindow then  // Change back to non fullscreen
begin
ChangeDisplaySettings(devmode(nil^), 0);
ShowCursor(True);
end;

if xglGamma_def <> xglGamma_Get then
begin
Log('...Restore default display brightness to ' +IntToStr(xglGamma_def)+ '% : success');
xglGamma_Set(xglGamma_def);
end;

if wglMakeCurrent(DC, 0) then
Log('...wglMakeCurrent( NULL, NULL ): success')
else
Log('...wglMakeCurrent( NULL, NULL ): failed');

if wglDeleteContext(RC) then
Log('...deleting GL context: success')
else
begin
Log('...deleting GL context: failed');
RC:=0;
end;

if (DC > 0) and (ReleaseDC(Handle, DC) <> 0) then
Log('...releasing DC: success')
else
begin
Log('...releasing DC: failed');
DC:=0;
end;

if (Handle <> 0) and (DestroyWindow(Handle)) then
Log('...destroying window: success')
else
begin
Log('...destroying window: failed');
Handle := 0;
end;

Log('---- finished R_Close ----');
end;


cyborg   (2005-04-15 08:31:00) [45]


> [50] П7   (14.04.05 17:39)
>    ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);

Чего это такое? По нулевому адресу неизвестно чего указываешь? Очень странно, что это работает.


Pa5ha   (2005-04-14 23:35:00) [46]

П7, блин :), ошибка не вылетает. Кнопка застревает на панели. Потом кликнешь и она исчезает.


П7   (2005-04-14 20:40:00) [47]

И на каком отрезке вашего кода возникает ошибка?


Pa5ha   (2005-04-14 19:29:00) [48]

У меня "absolute 0" не компилится.


 if CFG.EngineSet.Fullscreen  then             // Change back to non fullscreen
 begin
   ChangeDisplaySettings(devmode(nil^), 0);
 end;

...

 if ((h_DC > 0) and (ReleaseDC(h_Wnd, h_DC) = 0)) then
 begin
   MessageBox(0, 'Release of device context failed!', 'Error', MB_OK or MB_ICONERROR);
   h_DC := 0;
 end;

 // Attempts to destroy the window
 if ((h_Wnd <> 0) and (not DestroyWindow(h_Wnd))) then
 begin
   MessageBox(0, 'Unable to destroy window!', 'Error', MB_OK or MB_ICONERROR);
   h_Wnd := 0;
 end;

 // Attempts to unregister the window class
 if (not UnRegisterClass('OpenGL', hInstance)) then
 begin
   MessageBox(0, 'Unable to unregister window class!', 'Error', MB_OK or MB_ICONERROR);
   hInstance := 0;
 end;


Фрагмент моего кода.


П7   (2005-04-14 18:30:00) [49]

http://burks.bton.ac.uk/burks/language/pascal/uddf/pages/fullscrn.htm- в самом конце...
думаю сам догадаешься... И препода научишь. (:


П7   (2005-04-14 17:53:00) [50]

А потестить самому?


Venom Spawn   (2005-04-14 17:49:00) [51]

И всё же, что получается при Nil^?


П7   (2005-04-14 17:47:00) [52]

Видно не шибко твой препод рубит... (: Так ему и передай! (:


Venom Spawn   (2005-04-14 17:43:00) [53]


>    ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);


Вот! Давно хотел узнать - что есть такое разыменовывание указателя nil? (Препод по инфе сказал что это попросту не скомпилится :), тем не менее у Яна Хорна всё пашет!)


П7   (2005-04-14 17:39:00) [54]

Даже если и не делать анрег - не должна бага выскакивать...


 if FullScreen then
 begin
   ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);
   Log.Msg('Set normal screen settings.');
 end;
 if DestroyWindow(Wnd) then
   Log.Msg('Window is destroyed.')
 else
   Log.Err('Window is NOT destroyed.');
 if UnregisterClass(WIN_CLASS_NAME, Instance) then
   Log.Msg('Window class is unregistered.')
 else
   Log.Err('Window class is NOT unregistered.');


Вот как делаю я... Проблем не замечал.


Zak3D[@Tm]   (2005-04-14 17:33:00) [55]

Может Windows.UnregisterClass( AppName, hInstance ); не делаешь?
А вообще не знаю, на код смотреть нужно, а Хорновского Енгина нет ща под рукой.


Pa5ha   (2005-04-14 15:59:00) [56]

Блин, все написал, отправил, интернал сервер эррор. Короче. В двух словах. Дестрой Окна у меня есть. Весь проект в этой части как две капли с Хорновским basicEngine. Такая бага появляется только после завершения из фуллскрина. Потом на эту кнопку нажимаешь и она исчезает.


Zak3D[@Tm]   (2005-04-14 14:45:00) [57]

Наверно ты DestroyWindow(...) забыл сделать.


Zak3D[@Tm]   (2005-04-14 14:40:00) [58]

Pa5ha
Покажи как приложение закрываешь.


Pa5ha   (2005-04-14 12:39:00) [59]

PostQuitMessage(0); вставил. Лучше не стало.


Pa5ha   (2005-04-14 12:20:00) [60]

Нет. Просто бесконечный цикл завершается. В конце припишу PostQuitMessage.
Что ещё для этого надо? Какие обработчики?


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо