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

Zeqfreed ©   (2004-10-25 17:14:00) 

Добрый вечер, уважаемые!
В книге М. Краснова "OpenGL, графика в проектах Delphi" сказано, что для создания полноэкранного приложения достаточно растянуть окно на весь экран и, при необходимости, сменить разрешение экрана. Так вот меня мучит вопрос, зачем тогда в Direct3D нужно выполнять специальные действия для установки полноэкранного режима? И за счет чего тогда увеличивается производительность в OpenGL-полноэкранных приложениях, если вообще увеличивается, только при растягивании окна до размера экрана?


Imp   (2004-10-25 21:28:00) [21]

imho Краснов - тупИца! я его книги вместо анекдотов читаю.
он у меня в чёрном списке литературы

например, я делал так:


procedure InitFullScreenOpenGL;
var i, ScrX, ScrY, bpp, Freq: Integer;
   NewMode: _devicemodeA;
begin
 if RC <> 0 then DestroyRenderingContext(RC);

 i := frmStart.comboResolution.ItemIndex + 1;
 case i of
   1: begin ScrX := 640;  ScrY := 480 end;
   2: begin ScrX := 800;  ScrY := 600 end;
   3: begin ScrX := 1024;  ScrY := 768 end;
   else raise Exception.Create('invalid resolution');
 end;

 i := frmStart.comboBPP.ItemIndex + 1;
 case i of
   1: bpp := 16;
   2: bpp := 32;
   else raise Exception.Create('invalid bpp');
 end;

 i := frmStart.comboFreq.ItemIndex + 1;
 case i of
   1: Freq := 60;
   2: Freq := 70;
   3: Freq := 75;
   4: Freq := 80;
   5: Freq := 85;
   else raise Exception.Create('invalid frequency');
 end;

 NewMode.dmSize := sizeof(NewMode);
 NewMode.dmPelsWidth := ScrX;
 NewMode.dmPelsHeight := ScrY;
 frmGameScreen.Width := ScrX;
 frmGameScreen.Height := ScrY;
 NewMode.dmBitsPerPel := bpp;
 NewMode.dmDisplayFrequency := Freq;
 NewMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
 ChangeDisplaySettingsA(NewMode, CDS_FULLSCREEN);

 RC:=CreateRenderingContext(frmGameScreen.Canvas.Handle, [opDoubleBuffered], bpp,0{, bpp});
 if RC = 0 then raise Exception.Create('Error Creating Rendering Context');
 ActivateRenderingContext(frmGameScreen.Canvas.Handle, RC);

 LoadTextures;
 frmGameScreen.Cursor := crNone;
 glViewport(0, 0, frmGameScreen.ClientWidth, frmGameScreen.ClientHeight);
end;


только не забудь сохранить предыдущие параметры и восстановить их при завершении работы


procedure TfrmGameScreen.SaveScreenMode;
begin
 SavedMode.dmSize := sizeof(SavedMode);
 SavedMode.dmPelsWidth := Screen.Width;
 SavedMode.dmPelsHeight := Screen.Height;
 SavedMode.dmBitsPerPel := 0;
 SavedMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
end;

procedure TfrmGameScreen.RestoreScreenMode;
begin
 ChangeDisplaySettingsA(SavedMode, CDS_FULLSCREEN);
end;


Zeqfreed   (2004-10-25 19:06:00) [22]

Глянул 2 исходника, в каждом полноэкранный режим реализован одинаково:

1) Ставим необходимый режим ф-цией ChangeDisplaySettings со 2-ым параметром - CDS_FULLSCREEN.

2) Изменяем размеры главного окна в соответствии с шириной/высотой экрана

Это правильно? Может быть в Direct3d производятся эти же действия, только не явно?


Zeqfreed   (2004-10-25 18:39:00) [23]

2 П7:
(Сначала не увидел вопроса)
>>Что в твоём понимании "растянуть окно на весь экран и, при >>необходимости, сменить разрешение экрана"?

В моем понимании это установить ширину и высоту окна, на которое производится вывод, равными соответственно ширине и высоте экрана.

А что ещё необходимо сделать?


Zeqfreed   (2004-10-25 18:33:00) [24]


Полноэкранные приложения
Такие приложения достойны отдельного разговора в силу их особой значимости. Занять всю область экрана вам может потребоваться для того, чтобы повысить эффектность и зрелищность вашего проекта, особенно если на экране присутствует много объектов.
Прежде всего, необходимо сказать о том, что некоторые графические акселераторы поддерживают ускорение только в полноэкранном режиме и при определенных установках экрана, например, только при разрешении экрана 640x480 и цветовой палитре 16 бит на пиксел.
К сожалению, мне придется сообщить о наличии здесь некоторых проблем, впрочем, мы их успешно разрешим. Вернитесь к последнему примеру — проекту из подкаталога Ех27, где вывод средствами OpenGL осуществляется на окно без рамки и области заголовка. Поменяйте свойство windowstate формы на wsMaximized, чтобы окно после запуска раскрывалось на весь экран. Запустите проект или откомпилированный модуль. Что у вас получится, я предсказать не могу, он зависит от конкретной конфигурации машины. Если на вашем компьютере все происходит в ожидаемом режиме, т. е. весь экран занят окном голубоватого цвета, вы избавлены от множества проблем, если только не собираетесь распространять свои приложения. Дело в том, что я тестировал подобные проекты на компьютерах самой различной конфигурации и обнаружил, что чаще всего результат получается обескураживающий и неприятный: окно раскрывается некорректно, не полностью занимая экран. Причем неприятности появляются именно в связи с использованием OpenGL, простые проекты вполне справляются с задачей раскрывания на весь экран. Возможно, корень проблемы в несогласованности работы драйверов (как всегда!) или ошибках операционной системы.
Однако решение проблемы оказывается совсем простым.
Посмотрите пример из подкаталога Ех28. Это тот же пример, что и предыдущий, только немного измененный. Свойство windowstate окна формы установлено в wsNormal, а обработчик события onCreate дополнился строкой:
WindowState := wsMaximized;

Теперь все работает превосходно, окно действительно раскрывается на весь экран.
Свойство Formstyie окна можно задать как fsstayOnTop, и тогда приложение будет вести себя так, как многие профессиональные игры, не позволяя переключиться на другие приложения.
Другое решение проблемы очень похоже на предыдущее. Посмотрите пример Ех29 — модифицированный пример вывода на поверхность панели. Панель занимает всю клиентскую область окна (свойство Align имеет значение aiciient), а окно формы максимизировано и не имеет рамки.
Надеюсь, у вас теперь не будет неприятностей при попытке захватить всю область экрана, хотя нелегко объяснить, почему обычный метод не работает, а такой метод, по сути, ничем от него не отличающийся, работает.
Итак, полный экран отвоевывать мы научились. Теперь необходимо научиться менять программно, т. е. без перезагрузки, разрешение экрана: приложению может потребоваться другое, нежели установленное пользователем разрешение, к которому он привык в своей повседневной работе.
Проект FullScr из подкаталога ЕхЗО является упрощенным вариантом такой программы. После запуска приложения пользователю из списка предлагается выбрать желаемое разрешение экрана, которое устанавливается на время работы основного модуля — минимальной программы OpenGL. После окончания работы модуля возвращается первоначальное разрешение экрана.
Пример построен на использовании функции API CliangeDisplaySettings, первый аргумент которой — структура, описывающая требуемый режим. Второй аргумент — битовая комбинация констант, одна из которых задает тестирование режима без его установки.
Массив LowResModes заполняем перечислением всех возможных режимов, тестируем последовательно каждый из них и отмечаем те, тестирование для которых оказалось успешным. После пользовательского выбора действительно устанавливаем выбранный режим, а по завершению работы приложения возвращаем запомненный первоначальный режим.
Протестировав программу в различных режимах, вы можете выяснить, что не во всех из них возможно использование OpenGL, в некоторых режимах контекст воспроизведения не может быть получен.
В целом такой способ создания полноэкранного приложения я нахожу вполне удовлетворительным. При тестировании на компьютере без акселератора приложение в проблемных режимах выдавало сообщение о невозможности получения контекста, а при подключении акселераторов сообщение не появлялось, но в некоторых режимах окно и не окрашивалось. Акселераторы первых моделей могут искаженно передавать картинку в некоторых режимах.


Это цитата из книги, из которой лично я понял, что достаточно всего-лишь "растянуть окно на весь экран и, при необходимости, сменить разрешение экрана".

Если я не прав, пожалуйста объясните мне, как надо делать полноэкранные приложения в OpenGL!


П7   (2004-10-25 18:07:00) [25]


> Zeqfreed ©   (25.10.04 17:14)  

Ты уверен? Что в твоём понимании "растянуть окно на весь экран и, при необходимости, сменить разрешение экрана"? Не всё там так просто, как ты пишешь...


cyborg   (2004-10-25 17:55:00) [26]


> растянуть окно на весь экран и, при необходимости, сменить
> разрешение экрана.

Расстрел с применением контрольного выстрела!
   [ОДОБРЕНО]
cyborg


Страницы:   1 2

Наверх

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