![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы по OpenGL [Delphi, Windows]
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.
Что ещё для этого надо? Какие обработчики?