Главная страница
    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.5 MB
Время: 0.055 c
15-1198590208
FLuimer
2007-12-25 16:43
2008.02.03
Ищу название фильма...


15-1199182043
palva
2008-01-01 13:07
2008.02.03
Директива #import Borland C++ 5.5.1


15-1198128892
Artur
2007-12-20 08:34
2008.02.03
Поиск текста в pdf


15-1198261166
БарЛог
2007-12-21 21:19
2008.02.03
Новый год по-админски =)


15-1198751535
DmitrichJ
2007-12-27 13:32
2008.02.03
Как сделать стартовую страничку в IE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский