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

Вниз

Direct3D   Найти похожие ветки 

 
Malik   (2008-01-05 17:48) [0]

Изучаю DirectX по книге Сергея Есенина "DirectX и Delphi: разработка графических и мультимедийных приложений" без диска, а все из-за того, что в магазине этот диск по ошибке присвоили к книге другого автора, ну этот момент я только дома прочухал. Добрался я до 13 примера и там "забуксовал". Всё сделал как в книге написано, но не получается(((. Возможно автор не указал в книге какую-то мелочь. Уважаемый мастера помогите!!! Возможно вы увидите где я оплашал.
unit FormMainUnit;

interface

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

type
 TCustomVertex= packed record
   x, y, z, rwh:Single;
   color:DWORD;
   end;
 TMainForm = class(TForm)
   ApplicationEventsMain: TApplicationEvents;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure ApplicationEventsMainIdle(Sender: TObject;
     var Done: Boolean);
   procedure ApplicationEventsMainMinimize(Sender: TObject);
   procedure ApplicationEventsMainRestore(Sender: TObject);
   procedure ApplicationEventsMainActivate(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   FD3D: IDirect3D9;
   FD3dDevice: IDirect3DDevice9;
   FIsActive: Boolean;
   FWindowed:Boolean;
   FD3DVertexBuffer: IDirect3DVertexBuffer9;
   function InitD3D:HRESULT;
   procedure FreeD3D;
   function ClearDevice: HRESULT;
   function RenderScene: HRESULT;
   function PrepareVertices: HRESULT;
   function SetupCamera: HRESULT;
 public
   { Public declarations }
 end;
const
 D3DFVF_CUSTOMVERTEX=D3DFVF_XYZ or D3DFVF_DIFFUSE;
var
 MainForm: TMainForm;
implementation

uses Math;

{$R *.dfm}

function TMainForm.InitD3D: HRESULT;
var
 d3dDisplayInfo: TD3DDisplayMode;
 d3dParams: TD3DPresentParameters;
begin
 Result:=E_FAIL;
 FD3D:=Direct3DCreate9(D3D_SDK_VERSION);
 if FD3D=NIL then Exit;
 Result:=FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3dDisplayInfo);
 if Failed(Result) then exit;
 ZeroMemory(@d3dParams, SizeOf(d3dParams));
 d3dParams.Windowed:=FWindowed;
 d3dParams.SwapEffect:=D3DSWAPEFFECT_DISCARD;
 d3dParams.BackBufferFormat:=d3dDisplayInfo.Format;
 if not FWindowed then
 begin
   d3dParams.FullScreen_RefreshRateInHz:=d3dDisplayInfo.RefreshRate;
   d3dParams.BackBufferWidth:=d3dDisplayInfo.Width;
   d3dParams.BackBufferHeight:=d3dDisplayInfo.Height;
   BorderStyle:=bsNone;
 end
 else begin
   BorderStyle:=bsSizeable;
 end;
 Result:=FD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,
   D3DCREATE_SOFTWARE_VERTEXPROCESSING, @d3dParams, FD3DDevice);
 FD3dDevice.SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
 FD3dDevice.SetRenderState(D3DRS_LIGHTING,0);
end;

procedure TMainForm.FreeD3D;
begin
 FD3dDevice:=nil;
 FD3D:=nil;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 FWindowed:=true;
 if Failed(InitD3D) then
 begin
   ShowMessage("Îøèáêà èíèöèàëèçàöèè Direct3D...");
   Halt;
 end;

 if Failed(SetupCamera) then
 begin
   ShowMessage("Îøèáêà íàñòðîéêè êàìåðû...");
   Halt;
 end;
 if Failed(PrepareVertices)then
 begin
   ShowMessage("Îøèáêà çàïîëíåíèÿ áóôåðà âåðøèí...");
   Halt;
 end;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 FreeD3D;
end;

function TMainForm.ClearDevice:HRESULT;
begin
 Result:=E_FAIL;
 if FD3dDevice=nil then Exit;
 Result:=FD3dDevice.Clear(0,nil,D3DCLEAR_TARGET, D3DCOLOR_XRGB($00,0,$00),1,0);
end;

function TMainForm.RenderScene:HRESULT;
var
 WorldMatrix: TD3DMatrix;
 WorldMatrixX: TD3DMatrix;
 WorldMatrixY: TD3DMatrix;
 WorldMatrixZ: TD3DMatrix;
begin
 Result:=ClearDevice;
 if Failed(Result) then Exit;
 FD3dDevice.BeginScene;
 try
   FD3dDevice.SetStreamSource(0, FD3DVertexBuffer,0,SizeOf(TCustomVertex));
   FD3dDevice.SetFVF(D3DFVF_CUSTOMVERTEX);
   FD3dDevice.DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
 finally
   FD3dDevice.EndScene;
 end;
 FD3dDevice.Present(nil,nil,0,nil);
end;

procedure TMainForm.ApplicationEventsMainIdle(Sender: TObject;
 var Done: Boolean);
var
 hr:HRESULT;
begin
 if FIsActive then
 begin
   hr:= FD3dDevice.TestCooperativeLevel;
   if hr=D3DERR_DEVICELOST then exit;
   if hr=D3DERR_DEVICENOTRESET then
   begin
     FreeD3D;
     InitD3D;
   end;
   RenderScene;
 end;
 Done:=False;
end;

procedure TMainForm.ApplicationEventsMainMinimize(Sender: TObject);
begin
 FIsActive:=false;
end;

procedure TMainForm.ApplicationEventsMainRestore(Sender: TObject);
begin
 FIsActive:=true;
end;

procedure TMainForm.ApplicationEventsMainActivate(Sender: TObject);
begin
 FIsActive:=True;
end;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if (ssAlt in Shift) and (Key=VK_RETURN) then
 begin
   FWindowed:=not FWindowed;
   FreeD3D;
   InitD3D;
 end;
end;

function TMainForm.PrepareVertices:HRESULT;
Const
 Vertices: array [0..5] of TCustomVertex =(
 (x:-1; y:1; z:0; color: $00FF0000),
 (x:1; y:1; z:0; color: $00FF0000),
 (x:1; y:-1; z:0; color: $00FF0000),

 (x:1; y:-1; z:0; color: $00FF0000),
 (x:-1; y:-1; z:0; color: $00FF0000),
 (x:-1; y:1; z:0; color: $00FF0000));
var
 pVertices:Pointer;
begin
 result:=FD3dDevice.CreateVertexBuffer(SizeOf(Vertices), 0, D3DFVF_CUSTOMVERTEX,
   D3DPOOL_DEFAULT, FD3DVertexBuffer, nil);
 if Failed(Result) then Exit;
 Result:=FD3DVertexBuffer.Lock(0, SizeOf(Vertices), pVertices, 0);
 if Failed(Result) then exit;
 try
   CopyMemory(pVertices, @Vertices, SizeOf(Vertices));
 finally
   FD3DVertexBuffer.Unlock;
 end;
end;

function TMainForm.SetupCamera:HRESULT;
var
 ViewMatrix :TD3DMatrix;
 ProjectionMatrix :TD3DMatrix;
 Eye : TD3DVector;
 At: TD3DVector;
 Up: TD3DVector;
begin
 Eye.x:=0;  Eye.y:=0;  Eye.z:=-3;
 At.x:=0;  At.y:=0;  At.z:=0;
 Up.x:=0;  Up.y:=1;  Up.z:=0;
 D3DXMatrixLookAtLH(ViewMatrix, Eye, At, Up);
 FD3dDevice.SetTransform(D3DTS_VIEW, ViewMatrix);
 D3DXMatrixPerspectiveFovLH(ProjectionMatrix, D3DX_PI /4, 1, 1, 100);
 Result:=FD3dDevice.SetTransform(D3DTS_PROJECTION, ProjectionMatrix);
end;

end.


 
@!!ex ©   (2008-01-05 17:53) [1]

Весь код лень разбирать, да и с D3D уже года полтора не работал...
Ответь на вопросы:
Что должно получится? что получается? и чего не получается?
И я посмотрю что не так, если кто другой не ответит раньше...


 
Malik   (2008-01-05 18:00) [2]

Получиться должен прямоугольник в пространстве. Получается только черная пустота. Ошибок не выдает.


 
@!!ex ©   (2008-01-05 18:11) [3]

Замени все Exit на raise Exception.Create("Failed");


 
Malik   (2008-01-05 18:14) [4]

После замены ошибок не выдает


 
homm ©   (2008-01-05 18:15) [5]

> [2] Malik   (05.01.08 18:00)

Цзнаю Direct3D :) Кода — черт ногу сломит, а получится должен прямоугольник в пространстве :)


 
@!!ex ©   (2008-01-05 18:18) [6]

Убери установку камеры совсем.
Чтобы работать с исходной системой координат.


 
@!!ex ©   (2008-01-05 18:20) [7]

> [5] homm ©   (05.01.08 18:15)

да, опенгл поудобней будет. :)


 
Malik   (2008-01-05 18:26) [8]


> @!!ex ©   (05.01.08 18:18) [6]
> Убери установку камеры совсем.Чтобы работать с исходной
> системой координат.

Убрал, но всёравно не помогает.


 
@!!ex ©   (2008-01-05 18:33) [9]

> [8] Malik   (05.01.08 18:26)

Поигра с Z Значениями от -100 до 100.


 
Malik   (2008-01-05 18:36) [10]

В книге для этого примера приведены листинги методов SetupCamera и PrepareVertices, да еще сказано, что при инициализации надо задать режим обработки задних граней и отключить освещение сцены:
...
FD3dDevice.SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
FD3dDevice.SetRenderState(D3DRS_LIGHTING,0);
...

К сожалению не сказано когда конкретно вызывать SetupCamera.


 
@!!ex ©   (2008-01-05 18:39) [11]

> [10] Malik   (05.01.08 18:36)

Забудь о камере. она пока нафиг не нужна. давай разберемся, у тебя вообще прямоугольник рисуется или нет?
PrepareVertices надо вызывать в самом начале, после инициализации D3D.
SetupCamera надо вызывать непосредственно перед рендером сцены.


 
Malik   (2008-01-05 18:39) [12]


> Поигра с Z Значениями от -100 до 100.

Ставил значения 100,10,1, -1, -10,-100, но не помогло(((


 
@!!ex ©   (2008-01-05 18:43) [13]

> [12] Malik   (05.01.08 18:39)

Сорри, мне сейчас бежать пора, потом посмотрю подробнее.


 
Sapersky   (2008-01-05 22:27) [14]

Наверняка на сайте издательства можно скачать примеры к книге.
А так можно попробовать
FD3dDevice.SetRenderState(D3DRS_ZENABLE, 0);


 
Malik   (2008-01-05 22:42) [15]

Пробовал не помагает


 
Sapersky   (2008-01-06 01:04) [16]

TCustomVertex= packed record
 x, y, z, rwh:Single;
 color:DWORD;
end;
const
D3DFVF_CUSTOMVERTEX=D3DFVF_XYZ or D3DFVF_DIFFUSE;

Формат вершины не соответствует описанию.


 
Malik   (2008-01-06 14:33) [17]


> Sapersky   (06.01.08 01:04) [16]

Уже узнал об этой ошибке. Спасибо всем за участие.
Тема закрыта



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

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

Наверх




Память: 0.51 MB
Время: 0.014 c
1-1193421097
lookin
2007-10-26 21:51
2008.02.03
Чтение массива из Ini-файла


15-1199139401
Nic
2008-01-01 01:16
2008.02.03
С новым годом, друзья!


2-1200167272
Sonic90
2008-01-12 22:47
2008.02.03
ListBox и DrawText


15-1198529781
Evanescence
2007-12-24 23:56
2008.02.03
Ищу название и исполнитель песни


8-1173018362
Quelle
2007-03-04 17:26
2008.02.03
Градиент