Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
4-1092735230
surkis
2004-08-17 13:33
2004.09.26
Cлужбы и БД


14-1094494209
wl
2004-09-06 22:10
2004.09.26
улучшение интерфейса форума


1-1094717450
prorok2
2004-09-09 12:10
2004.09.26
CheckListBox и перерисовка


3-1093424651
Snip
2004-08-25 13:04
2004.09.26
Опять InterBase


14-1094729589
kand
2004-09-09 15:33
2004.09.26
Кто нить юзает MDaemon?