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

Вниз

Проблема с Direct3D приложением   Найти похожие ветки 

 
Verstak ©   (2006-07-06 23:50) [0]

Набираю примитивнейший пример из книги 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.


 
Verstak ©   (2006-07-07 18:51) [1]

Проблема в строке 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.- что и следовало ожидать. Но почему?


 
Cash ©   (2006-07-16 22:46) [2]

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

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



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

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

Наверх




Память: 0.48 MB
Время: 0.043 c
3-1166595725
Ega23
2006-12-20 09:22
2007.03.18
Добавить Calculated-поле в ран-тайм


15-1172114951
Slider007
2007-02-22 06:29
2007.03.18
С днем рождения ! 22 февраля


2-1172066624
Kolan
2007-02-21 17:03
2007.03.18
А AV в модуле rtl100.bpl что значит ?


2-1172006483
Comp
2007-02-21 00:21
2007.03.18
Маленький простой вопрос - прокрутка формы


15-1171677913
Tirael
2007-02-17 05:05
2007.03.18
AC3