Текущий архив: 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.043 c