Форум: "Media";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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 вся ветка
Форум: "Media";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c