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

Вниз

IDirect3DDevice9 Не хочет создаваться   Найти похожие ветки 

 
Ford ©   (2005-09-26 19:45) [0]

Почему у меня не создаётся Device ??? И где можно найти доки к
DirectX на русском

procedure TForm1.Button1Click(Sender: TObject);
var
 D3DObject: IDirect3D9; //Директ 3Д Объект
 D3DDevice: IDirect3DDevice9;
 D3DParametre: D3DPRESENT_PARAMETERS;
 hr: Hresult;
 InfoFromVideo: D3DCAPS9;
begin
 //  1.  Созданния Директ 3Д Объекта
 D3DObject:= nil;
 D3DObject:= Direct3DCreate9((* это значенние должн вчегда быть D3D_SDK_VERSION *) D3D_SDK_VERSION);

 //  2.1 Заполнения структуры нужной для созданния устройства
 D3DParametre.Windowed:= true;
 D3DParametre.BackBufferFormat:= D3DFMT_UNKNOWN;
 D3DParametre.SwapEffect:= D3DSWAPEFFECT_DISCARD;
 D3DParametre.MultiSampleType:= D3DMULTISAMPLE_NONE;
 D3DParametre.hDeviceWindow:= panel1.Handle;
 D3DParametre.EnableAutoDepthStencil:= false;
 D3DParametre.PresentationInterval:= D3DPRESENT_INTERVAL_DEFAULT;
 //  2.2 Созданния Директ 3Д Устройства
 D3DDevice:= nil;
 hr:= D3DObject.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, form1.Handle,
   D3DCREATE_HARDWARE_VERTEXPROCESSING, @D3DParametre, D3DDevice );

 if (FAILED(hr)) then Halt(1);

end;


 
Sphinx ©   (2005-09-26 20:21) [1]

Инициализация в оконном режиме
http://forum.mirg.ru/index.php?act=Attach&type=post&id=10436

и в полноэкранном
http://forum.mirg.ru/index.php?act=Attach&type=post&id=10438

а так - ошибка на вскидку одна:
> D3DParametre.BackBufferFormat:= D3DFMT_UNKNOWN;
Нужно явно указывать формат
D3DFMT_A8R8G8B8 (32 битный режим) или D3DFMT_R5G6B5 (16 битный режим) должны работать почти всегда

а вообще....половину параметров можно получить на автомате...
вот куски из кода инициализации...у меня пока что проблем не было с ним :)
 // запись параметров устройства вывода Direct3D
 TD3DParametrs   = record
   HALTnL            : Boolean;                // признак аппаратной поддержки просчета вершин, трансформаций и освещения
   D3DAdapter        : Longword;               // устройство вывода
   DevType           : TD3DDevType;            // тип устройства вывода
   BufferPixFormat   : TD3DFormat;             // формат пикселей
   DepthFormat       : TD3DFormat;             // формат буфера глубины
   BehaviorFlags     : Longword;               // параметры инициализации
   PresentParameters : TD3DPresentParameters;  // параметры устройства
   DisplayMode       : TD3DDisplayMode;        // текущие настройки дисплея
   Caps              : TD3DCaps9;              // данные устройства вывода
   Identifier        : TD3DAdapterIdentifier9; // данные о драйвере устройства вывода
 end;
...
recD3DParametrs         : TD3DParametrs;      // запись параметров устройства вывода
...
 d3d9                    : IDirect3D9;         // основной интерфейс DirectX
 d3d9Device              : IDirect3DDevice9;   // интерфейс устройства вывода Direct3D
...
 // очистка и инициализация записи параметров устройства вывода
 with recD3DParametrs do
   begin
     HALTnL          := False;
     D3DAdapter      := D3DADAPTER_DEFAULT;
     DevType         := D3DDEVTYPE_HAL;
     BufferPixFormat := D3DFMT_UNKNOWN;
     DepthFormat     := D3DFMT_UNKNOWN;
     BehaviorFlags   := 0;
     ZeroMemory (@PresentParameters, SizeOf(TD3DPresentParameters));
     ZeroMemory (@DisplayMode,       SizeOf(TD3DDisplayMode));
     ZeroMemory (@Caps,              SizeOf(TD3DCaps9));
     ZeroMemory (@Identifier,        SizeOf(TD3DAdapterIdentifier9));
   end;
...
 // создаем основной интерфейс DirectX
 d3d9 := Direct3DCreate9(D3D_SDK_VERSION);
 if d3d9 = nil then
   Exit;

 // получаем параметры экрана
 hrError := d3d9.GetAdapterDisplayMode(recD3DParametrs.D3DAdapter, recD3DParametrs.DisplayMode);
 if Failed(hrError) then
   begin
     d3d9 := nil;
     Exit;
   end;

 // получаем информацию об устройстве вывода
 hrError := d3d9.GetDeviceCaps(recD3DParametrs.D3DAdapter, recD3DParametrs.DevType, recD3DParametrs.Caps);
 if (Failed(hrError)) and (hrError = D3DERR_INVALIDDEVICE) then
   begin
     recD3DParametrs.DevType := D3DDEVTYPE_REF;
     hrError := d3d9.GetDeviceCaps(recD3DParametrs.D3DAdapter, recD3DParametrs.DevType, recD3DParametrs.Caps);
   end;
 // если информацию об устройстве получить не удалось
 if Failed(hrError) then
   begin
     d3d9 := nil;
     Exit;
   end;

 // получаем данные о драйвере без проверки правильности
 d3d9.GetAdapterIdentifier(recD3DParametrs.D3DAdapter, 0, recD3DParametrs.Identifier);
...
 // заполнение полей записи создания устройства вывода
 with recD3DParametrs.PresentParameters do
   begin
     BackBufferWidth             := iSetting.ScreenWidth;
     BackBufferHeight            := iSetting.ScreenHeight;
     case iSetting.BPP of
       16: BackBufferFormat      := D3DFMT_R5G6B5;
       32: BackBufferFormat      := D3DFMT_A8R8G8B8;
     end;
     BackBufferCount             := 1;
     MultiSampleType             := D3DMULTISAMPLE_NONE;
     MultiSampleQuality          := 0;
     SwapEffect                  := D3DSWAPEFFECT_DISCARD;
     hDeviceWindow               := recRenderTargetWindow.WindowHandle;
     Windowed                    := not(iSetting.FullScreen);
     EnableAutoDepthStencil      := True;
     AutoDepthStencilFormat      := D3DFMT_D16;
     FullScreen_RefreshRateInHz  := D3DPRESENT_RATE_DEFAULT;
     if iSetting.VSync then
       PresentationInterval      := D3DPRESENT_INTERVAL_DEFAULT
     else
       PresentationInterval      := D3DPRESENT_INTERVAL_IMMEDIATE;
   end;
...
 // определение второстепенных параметров
 if (recD3DParametrs.Caps.DevCaps and D3DDEVCAPS_HWTRANSFORMANDLIGHT) = D3DDEVCAPS_HWTRANSFORMANDLIGHT then
   begin
     recD3DParametrs.HALTnL := True;
     recD3DParametrs.BehaviorFlags := D3DCREATE_HARDWARE_VERTEXPROCESSING;
   end
 else
   begin
     recD3DParametrs.BehaviorFlags := D3DCREATE_SOFTWARE_VERTEXPROCESSING
   end;
...
 // создание устройства вывода Direct3D
 hrError := d3d9.CreateDevice
                   (recD3DParametrs.D3DAdapter,
                    recD3DParametrs.DevType,
                    recRenderTargetWindow.WindowHandle,
                    recD3DParametrs.BehaviorFlags,
                    @recD3DParametrs.PresentParameters,
                    d3d9Device);
 if Failed(hrError) then
   begin
     d3d9Device := nil;
     Exit;
   end


 
NailMan ©   (2005-09-26 20:22) [2]

1.
D3DCREATE_HARDWARE_VERTEXPROCESSING  видеокарта поддерживает?

2. BackBufferFormat необходимо задавать явно. Если не знаешь что тебе нужно определи какой у десктопа формат поверхности.

к примеру делается так
d3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT,D3DMM);
 If d3dpp.BackBufferFormat<>D3DMM.Format then
    d3dpp.BackBufferFormat:=d3dmm.Format;


где var D3dMM:TD3DDisplayMode;

3. EnableAutoDepthStencil желательно включить и указать формат Z-буфера.

4. нужно указывать все параметры создаваемой плоскости, даже если она оконная

к примеру
  D3DPP.BackBufferWidth:=ScreenWidth;
  D3DPP.BackBufferHeight:=ScreenHeight;

и обязательно
  D3DPP.BackBufferCount:=1;

И вообще анализируй возвращаемый код ошибки в твоей переменной HR. Среди модулей есть функция генерации текстового описания ошибки который можно showmessage-нуть.

---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13


 
Ford ©   (2005-09-26 20:25) [3]

Попробал поменять  BackBufferFormat не выходит, щас код твой посмотрю чо к чему


 
Ford ©   (2005-09-26 20:31) [4]

Так я понял то что не создает из за ошибки в установленных мной параметрах. Так а функция как называеться чтоб описанния ошибки посмотреть.


 
NailMan ©   (2005-09-26 20:35) [5]

DXGetErrorString9 строковый эквивалент кода ошибки

---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13


 
Sphinx ©   (2005-09-26 20:45) [6]

Угу...только при этом не забудь dxerr.dll скопировать...
А лучше, если есть DirectX SDK выводить куда-нибудь код ошибки, только приводи к Cardinal например, а то HResult не всегда правильно выводит и используй "DirectX Error Lookup" то же самое - только dll не нужна будет...


 
Ford ©   (2005-09-26 21:09) [7]

Написала D3DERR_INVALIDCALL, че такое незнаю


 
Sphinx ©   (2005-09-26 21:20) [8]

DirectX SDK
D3DERR_INVALIDCALL The method call is invalid. For example, a method"s parameter may have an invalid value.


 
Sphinx ©   (2005-09-26 21:22) [9]

Я же тебе дал две ссылки на работающие примеры создания и инициализации директа...
Посмотреть в них код "гордость не позволяет" (с) ???


 
Ford ©   (2005-09-26 21:26) [10]

Ладно щас гляну, тут такой вопрос есть ли сылка на справку по функциям желательнно офицальнная.  В SDK есть какие либо справки ??? или там тока заголовки да примеры, а то думаю кочать или нет


 
Sphinx ©   (2005-09-26 21:39) [11]

($SDK ROOT)\Documentation\DirectX9\directx9_m.chm - 12 МБ
Думаю достаточная справка :)

А так...если в Инете - то онлайновый экземпляр того же самого
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/directx9cpp.asp


 
Sphinx ©   (2005-09-26 21:40) [12]

тэк...ошибочка малость directx9_m.chm - это для Managed
а для обычных программ - directx9_c.chm и весит она уже 14 МБ


 
Ford ©   (2005-09-26 22:05) [13]

У меня SDK как таковой нету, хочу тока справку скачать
Где сылку на неё найти ???



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

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
15-1142683769
Petr V. Abramov
2006-03-18 15:09
2006.04.09
Юридический форум


15-1142268082
ZeFiR
2006-03-13 19:41
2006.04.09
Карта Киева


15-1142790152
Bogdan1024
2006-03-19 20:42
2006.04.09
Экстраполяция


3-1139599601
Варяг
2006-02-10 22:26
2006.04.09
Проблем подключения VFoxPro через ADO


2-1143039573
Boris Marchenko
2006-03-22 17:59
2006.04.09
Перестановки