Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Direct3D приложением [D7, WinXP]


Verstak ©   (2006-07-06 23:50:00) 

Набираю примитивнейший пример из книги DirectX 9.The Definitive Guide. и возникает исключение EAccessViolation. Скорее всего из-за строки D3DDevice.UpdateSurface(Surface,nil,BackBufferSurface,nil);Это же, если мне не изменяет память, один из примеров в папке Tutorials  в DirectX SDK 9. Я просто перевел с С на Delphi. Использую перевод SDK  с http://www.clootie.ru/.По идее ошибка Dereferences a nil (Delphi) or NULL (C++) pointer, но где?

unit Unit1;

interface

uses
 Windows, Messages, Winerror, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Direct3D9, D3DX9;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   function InitD3D(Window : HWND): HRESULT;
   procedure Render;
   procedure Cleanup;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 OurDirect3Dobject : IDirect3D9 = nil;
 D3DDevice : IDirect3DDevice9 = nil;
 Surface : IDirect3DSurface9 = nil;
 BackBufferSurface : IDirect3DSurface9 = nil;

implementation

{$R *.dfm}
function TForm1.InitD3D(Window : HWND):HRESULT;
var
 DeviceParameters : D3DPRESENT_PARAMETERS;
begin
 OurDirect3DObject:=nil;
 OurDirect3DObject:=Direct3DCreate9(D3D_SDK_VERSION);

 if (OurDirect3DObject=nil) then Result:=E_FAIL;

 ZeroMemory(@DeviceParameters,SizeOf(DeviceParameters));

 DeviceParameters.Windowed:=true;
 DeviceParameters.SwapEffect:=D3DSWAPEFFECT_DISCARD;
 DeviceParameters.BackBufferFormat:=D3DFMT_UNKNOWN;
 DeviceParameters.EnableAutoDepthStencil:=true;
 DeviceParameters.AutoDepthStencilFormat:=D3DFMT_D16;

 if (Failed(OurDirect3DObject.CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Window, D3DCREATE_SOFTWARE_VERTEXPROCESSING,@DeviceParameters,D3DDevice))) then Result:=E_FAIL;

 Result:=S_OK;

end;

procedure TForm1.Cleanup;
begin
 if(Surface <> nil) then Surface:=nil;
 if(BackBufferSurface <> nil) then Surface:=nil;
 if(D3DDevice <> nil) then D3DDevice:=nil;
 if(OurDirect3DObject <> nil) then OurDirect3DObject:=nil;
end;

procedure TForm1.Render;
var
 Info : D3DXIMAGE_INFO;
begin
 if  D3DDevice=nil then Exit;
 D3DDevice.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,127,0),1.0,0);

 D3DXGetImageInfoFromFile('dx5_logo.bmp',Info);
 D3DDevice.CreateOffscreenPlainSurface(Info.Width,Info.Height,Info.Format,D3DPOOL _SYSTEMMEM,Surface,nil);
 D3DXLoadSurfaceFromFile(Surface,nil,nil,'dx5_logo.bmp',nil,D3DX_FILTER_NONE,0,ni l);
 D3DDevice.GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,BackBufferSurface);

 D3DDevice.BeginScene;
 // place rendering code here

 D3DDevice.UpdateSurface(Surface,nil,BackBufferSurface,nil);
 D3DDevice.EndScene;

 D3DDevice.Present(nil,nil,0,nil);
end;

procedure TForm1.FormCreate(Sender: TObject);

begin
 if Failed(Form1.InitD3D(Form1.Handle)) then Application.Terminate;

end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 Render;
 ValidateRect(Form1.Handle,nil);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Form1.Cleanup;
end;

end.


Cash   (2006-07-16 22:46:00) [1]

Чё-ет вы, товарищь, не туда забрались... :\
Info.Format чему равен?
Зачем тебе D3DPOOL_SYSTEMMEM? Тыж его толком и не поюзаешь!

Invalid Call у тебя явно из за Info.Format вылез.
И, так, на будущее, в справне по DirectX 9.0b сказано, что Managed и
System пулы этим вызовом не поддерживаются. Надо юзать Default пул и
пересоздавать его после каждой потери девайса.


Verstak   (2006-07-07 18:51:00) [2]

Проблема в строке D3DDevice.CreateOffscreenPlainSurface(Info.Width,Info.Height,Info.Format,D3DPOOL  _SYSTEMMEM,Surface,nil);

Surface после него равна nil, а DXGetErrorString9() выдает
D3DERR_INVALIDCALL
The method call is invalid. For example, a method's parameter may not be a valid pointer.- что и следовало ожидать. Но почему?


Наверх

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