Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

D3D fullscreen   Найти похожие ветки 

 
nexxiss ©   (2004-05-25 13:49) [0]

Добрый день. Вы не могли бы подсказать: как правильно создать полноэкранное приложение под D3D с разрешением 800х600 ?


 
NailMan ©   (2004-05-25 14:20) [1]

Перед созданием девайса, в PRESENT_PARAMETERS указываешь Windowed:=true и все должно быть пучком.

---
WBR, NailMan aka 2:5020/3337.13


 
nexxiss ©   (2004-05-25 14:29) [2]

>Перед созданием девайса, в PRESENT_PARAMETERS указываешь Windowed:=true и все должно быть пучком.

Мне нужно приложение на весь экран, а разрешение должно быть 800х600.


 
nexxiss ©   (2004-05-25 14:29) [3]

>Перед созданием девайса, в PRESENT_PARAMETERS указываешь Windowed:=true и все должно быть пучком.

Мне нужно приложение на весь экран, а разрешение должно быть 800х600.


 
smb   (2004-05-25 17:49) [4]

http://www.firststeps.ru/mfc/directx/dr3d/dr3d1.html
Шаг №7


 
NailMan ©   (2004-05-25 18:26) [5]

Тьфу, тоесть Windowed:=False, конечно же.

А как ты создаешь хэндл окна? Вручную или формой пользуешься?

---
WBR, NailMan aka 2:5020/3337.13


 
nexxiss ©   (2004-05-26 03:00) [6]

А как ты создаешь хэндл окна? Вручную или формой пользуешься?


Окно создается вручную.
Насколько я понял, то можно изменить разрешение рабочего стола на 800х600 и тогда уже создавать объект D3D, а при завершении работы приложения восстановить старые атрибуты рабочего стола. Или это не правильная мысля ?

to smb>
мне нужно 800х600 разрешение, там по ссылке находится классический пример, это я могу сделать без проблем.


 
NailMan ©   (2004-05-26 09:16) [7]

Окно создается вручную.
Насколько я понял, то можно изменить разрешение рабочего стола на 800х600 и тогда уже создавать объект D3D, а при завершении работы приложения восстановить старые атрибуты рабочего стола. Или это не правильная мысля ?

Неправильная конечно. Точнее почти неправильная - когда происходит создание Д3Д в полноэкранном режиме, то разрешение автоматически переключатеся на заданное пр создании девайса, а при разрушении ег возвращается обратно.

Вобщем как я создаю окно и девайс(прошу логику кода не критиковать):
Procedure CreateMainWindow(FullScreen:Boolean);
begin
 with WndClass do begin
   style := CS_VREDRAW or CS_HREDRAW;
   lpfnWndProc := @WndProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   WndClass.hInstance := HInstance;
   hIcon := LoadIcon(HInstance, IDI_APPLICATION);
   hCursor := LoadCursor(HInstance, IDC_ARROW);
   hbrBackground := GetStockObject(BLACK_BRUSH);
   lpszMenuName := nil;
   lpszClassName:= @AppName;
 end;
 RegisterClass(WndClass);
 If FullScreen then
 Handle:=CreateWindowEx(WS_EX_TOPMOST, @AppName, "Universal Traveller", WS_POPUP, 0, 0,
                        ScreenWidth, ScreenHeight, 0, 0, HInstance, nil)
 else
 Handle:=CreateWindow(@AppName,"Universal Traveller",CW_USEDEFAULT, 0, 0, ScreenWidth, ScreenHeight, 0, 0, HInstance, nil);
end;


Function TGameRender.InitializeDirect3DFullScreenMode:Boolean;
var pMode: TD3DDisplayMode;
begin
 D3D:=nil;
 dev:=nil;
 FPSFont:=nil;
 D3D := Direct3DCreate9(D3D_SDK_VERSION);
  If d3d=nil then begin LOG.Add(log_warningid,"Direct3D interface creating error");result:=false;exit;end;

 D3D.GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,D3Dcaps);
 D3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT,pMode);
  D3DPP.BackBufferWidth:=ScreenWidth;
  D3DPP.BackBufferHeight:=ScreenHeight;
  D3DPP.BackBufferFormat:=GetFormatFromBPP(ColorDepth,False);
  D3DPP.BackBufferCount:=1;
  D3DPP.MultiSampleType:=GetSampleTypeFromString(AntialiasingSampling);
  D3DPP.SwapEffect:=D3DSWAPEFFECT_DISCARD;
  D3DPP.Windowed:=False;
  D3DPP.EnableAutoDepthStencil:=true;
  D3DPP.AutoDepthStencilFormat:=GetFormatFromBPP(ZBufferDepth,True);
  If VSync then
   begin
    D3DPP.FullScreen_RefreshRateInHz:=pMode.RefreshRate;
    D3DPP.PresentationInterval:=D3DPRESENT_INTERVAL_DEFAULT;
   end
  else
    D3DPP.PresentationInterval:=D3DPRESENT_INTERVAL_IMMEDIATE;

Result:=InitializeDirect3D;
end;


Function TGameRender.InitializeDirect3D:Boolean;
var hr:hresult;
    iFlag:Cardinal;
begin
 result:=true;
 LOG.Add(log_infoId,"Creating Direct3D device with following parameters:");
 If Fullscreen=False then tempstring:="Windowed" else tempstring:="Fullscreen";

 LOG.Add(log_infoId,"Resolution: "+inttostr(d3dpp.BackBufferWidth)+" X "+
                      inttostr(d3dpp.BackBufferHeight)+", ColorDepth: "+inttostr(ColorDepth)+" BPP, Z-Buffer Depth: "+
                      inttostr(ZBufferDepth)+" BPP, Display Mode: "+TempString);

 If FullScreen and VSync then
  LOG.Add(log_infoId,"Fullscreen refreshrate = "+inttostr(d3dpp.FullScreen_RefreshRateInHz));

 LOG.Add(log_infoId,"Antialiasing multisample type: "+GetSampleTypeFromFormat(d3dpp.MultiSampleType));

iflag:=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 If UseHardWareTL and checkflag(D3Dcaps.DevCaps,D3DDEVCAPS_HWTRANSFORMANDLIGHT) then
  begin
   iflag := D3DCREATE_HARDWARE_VERTEXPROCESSING;
   if ForceMixedTLProcessing then iflag := D3DCREATE_MIXED_VERTEXPROCESSING else
    if CheckFlag(D3Dcaps.DevCaps,D3DCREATE_PUREDEVICE) then
     iflag:=iflag or D3DCREATE_PUREDEVICE;
  end;

 Case iFlag of
  D3DCREATE_HARDWARE_VERTEXPROCESSING or
  D3DCREATE_PUREDEVICE                : begin
                                         tempstring:="Use hardware Transform and Lightning (Pure HW TnL)";
                                         HWTnLSupported:=true;
                                        end;
  D3DCREATE_HARDWARE_VERTEXPROCESSING : begin
                                         tempstring:="Use hardware Transform and Lightning (TnL)";
                                         HWTnLSupported:=true;
                                        end;
  D3DCREATE_SOFTWARE_VERTEXPROCESSING : tempstring:="Use software Transform and Lightning(TnL)";
  D3DCREATE_MIXED_VERTEXPROCESSING :    tempstring:="Use mixed vertex processing (HW TnL and software vertex shaders)";
 end;
 LOG.Add(log_infoId,"Vertex Processing : "+TempString);

 hr:=D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle, IFlag, @D3DPP, Dev);
  if  failed(Hr) then
   begin
    LOG.Add(LOG_Warningid,"Direct3D Device creating error code: "+DXGetErrorString9(hr)); result:=false;exit;
   end;
 LOG.MidLogseparator;
 CompressedTexturesSupported:=CheckTextureFormat(D3DFMT_DXT3,d3dpp.BackBufferFormat);

 If dword(MaxActiveLights)>D3DCaps.MaxActiveLights then MaxActiveLights:=D3DCaps.MaxActiveLights;

 ShowWindow(Handle, SW_NORMAL);
 CursorShow(False);

 InitializeDXFont(FPSFont,FPSLogFont,12,"Arial",False);
 FPSRect:=ssrect(5,ScreenHeight-16,200,ScreenHeight);
 InfoRect:=ssrect(5,8,screenwidth,128);
CreateStates;
dev.GetCreationParameters(CP);
AddDirect3DRenderToLog;
end;


Вобщем вот так. В примере конечно много лишнего(связанного со спецификой моего подхода к оформлению логгинга), так что всякие такие рюшки смело игнорируй.

---
WBR, NailMan aka 2:5020/3337.13


 
nexxiss ©   (2004-05-26 14:08) [8]

Спасибо за примерчик, доберусь до дома попробую сделать исходя из твоего кода. Вечером сообщу результат страданий. :)


 
NailMan ©   (2004-05-26 14:58) [9]

Да пример на D3D9, так что где-то могут быть несовпадения в параметрах создания с D3D8(если конечно его юзаешь).

---
WBR, NailMan aka 2:5020/3337.13


 
nexxiss ©   (2004-05-27 14:05) [10]

Да, твои догадки правильны, я использую D3D8. Глядя на твой код, решил тоже организовать подробный логгинг. В результате были найдены места, где наделано ошибок. Я делал почти все правильно, девайс не создавался из-за неправильного формата пикселей для бэкбуффера. Не могу понять, почему не подходит формат с альфасоставляющей ? Есть подозрение что карточка не поддерживает. Или проблема может быть в чем-то другом ?


 
NailMan ©   (2004-05-27 14:30) [11]

nexxiss ©
Чтобы проверить поддерживается ли плоскость нужного формата, после создания IDirect3D8 вытащи Caps-ы дефолтного девайса. и смотри в них какие поддерживаются форматы для бэкбуффера.

Как правило, видеокарты не умеют 32-битный режим с альфой, а умеют X8R8G8B8(нормальный 32-bit) или S8X8R8B8(со стенсилом).

Так что устанавливай X8R8G8B8 и радуйся жизни.

---
WBR, NailMan aka 2:5020/3337.13


 
nexxiss ©   (2004-05-27 16:35) [12]

Спасибо за совет. Все отлично работает. Какого твое мнение, где лучше всего проводить рендеринг сцены:
1 - В onIdle
2 - В onTimer
?


 
Bryke ©   (2004-05-27 17:14) [13]


> Спасибо за совет. Все отлично работает. Какого твое мнение,
> где лучше всего проводить рендеринг сцены:
> 1 - В onIdle
> 2 - В onTimer
> ?

Лучше в OnIdle


 
nexxiss ©   (2004-05-27 17:17) [14]

Ок, а обработку процессов и различных данных от которых зависит рендеринг ?


 
NailMan ©   (2004-05-27 17:37) [15]

Ок, а обработку процессов и различных данных от которых зависит рендеринг ?

Это делается по тикам, т.е. для каждого объекта, который должен как-то изменять состояние, надо сделать некий промежуток времени(тик) в который он будет обновлять свое состояние.

Скажем такая схема:

У каждого ИО(игровой объект) есть переменные которые отвечают за
его ТИК:
var ПредыдущееВремя:Cardinal;
   ВремяЗадержки:Cardinal;

------- основной цикл(onIdle) -------------

For i:=0 to КоличествоОбъектов-1 do
begin
 if ТекущееВремя-ПредыдущееВремя>=ВремяЗадержки then
   Begin
    ...изменяем состояние объекта
    ПредыдущееВремя:=ТекущееВремя;
   end;
end;

------- основной цикл(onIdle) -------------

Итак "ТекущееВремя" - это функция получения значения системного таймера.
Может использоваться как GetTickCount, так и QueryPerformanceCounter. Второй предпочтительней, так как очень высокая точность, но для его использования необходимо еще и вычислить разрешение таймера(на разных тачках оно слегка колеблется по значению).

"ВремяЗадержки" - это значение периода бездействия для объекта. Иными словами - это период через которое будет происходить следующее изменение состояния. Скажем если выставить это значение =20, то это будет 50 раз в сек(50*20=1000мс).

Т.о. у тебя для каждого объекта будет время на обработку. Идеал - когда эти тики случаются в разное время и равномерно случаются в течение секунды.

---
WBR, NailMan aka 2:5020/3337.13


 
NailMan ©   (2004-05-27 17:47) [16]

Пардон хабыл добавить сам объект:

For i:=0 to КоличествоОбъектов-1 do
begin
if ТекущееВремя-Объект[i].ПредыдущееВремя>=Объект[i].ВремяЗадержки then
  Begin
   ...изменяем состояние объекта
   Объект[i].ПредыдущееВремя:=ТекущееВремя;
  end;
end;


---
WBR, NailMan aka 2:5020/3337.13


 
nexxiss ©   (2004-05-29 13:28) [17]

Ну теперь все сомненения пропали, буду step by step продвигаться дальше. Спасибо за инф-цию. Я примерно это так все и предполагал, только хотел использовать не массив объектов, а динамические структуры данных, на мой взгляд это будет несколько быстрее. Теперь дело осталось за немногим: научиться правильно ( сточки зрения оптимизации) натягивать текстуру на квадрат.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.038 c
4-1092969893
Poluprovodnik
2004-08-20 06:44
2004.09.26
Прочитать значение переменной среды окружения


14-1094401976
Stany
2004-09-05 20:32
2004.09.26
исходник для подсчета интернет траффика


3-1093872223
sloug
2004-08-30 17:23
2004.09.26
Дата с повторениями


6-1090190924
Лев Ландау
2004-07-19 02:48
2004.09.26
Как сгенерить html-страницу и поместить ее в TWebBrowser?


1-1094637857
jonik
2004-09-08 14:04
2004.09.26
Форма с Настройками программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский