Вниз
Скачать: CL | DM;

И снова DirectX9   Найти похожие ветки 

← →
ProgRAMmer Dimonych ©   (2007-06-21 23:15) [0]

Приведите, пожалуйста, пример программы WinAPI (Delphi) с использованием Mesh"ей. Сегодня наконец-то добился, чтобы нечто отдалённо напоминающее искомый объект вывелось на экран, но на выходе - Access Violation (кроме DirectX ничего создаваемого//удаляемого (типа объектов) в программе не используется).

Заранее спс.


← →
Zeqfreed ©   (2007-06-21 23:32) [1]

Меш — это набор вершин. Какие проблемы его отрисовать?

Код лучше показывай. Где-нибудь, наверное, _Release написал или забыл, я уж не помню как там было :)

А вообще, бери лучше C++ и OpenGL. Приятней гораздо :)


← →
ProgRAMmer Dimonych ©   (2007-06-22 01:15) [2]

> Код лучше показывай.

ОК, только больно не бить :)

Проект простенький пока, для изучения. Все Vertex- и IndexBuffer"ы отбросил.

Файл проекта DX.dpr

program DX;

uses
 Windows, Messages, AuxLib, DXAux, Direct3D9, D3DX9;

var
Wnd:HWND;
WndMsg:TMsg;
DXObj:TDXObj;
DXDev:TDXDev;
DXMesh:ID3DXMesh;

function OnIdle:HRESULT;
begin
Result:=E_FAIL;
if Failed(DXDev.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1,0)) then Exit;
if Failed(DXDev.BeginScene) then Exit;
if Failed(DXDev.SetFVF(DXMesh.GetFVF)) then Exit;
if Failed(DXMesh.DrawSubset(0)) then Exit;
if Failed(DXDev.EndScene) then Exit;
if Failed(DXDev.Present(nil,nil,0,nil)) then Exit;
Result:=D3D_OK;
end;

procedure DoExit;
begin
if Assigned(DXMesh) then begin DXMesh._Release; DXMesh:=nil; end;
DeInitDX(DXObj,DXDev);
Halt;
end;

function WndProc(Window:HWND; Msg:UINT; wParam,lParam:Cardinal):Cardinal; stdcall;
begin
Result:=0;
case Msg of
 WM_DESTROY:
  DoExit;
 WM_KEYUP:
  if wParam=VK_ESCAPE then DoExit;
 else
  Result:=DefWindowProc(Window,Msg,wParam,lParam);
end;
end;

begin
Wnd:=CreateMyCoolWindow(@WndProc);
ShowWindow(Wnd,SW_SHOWMAXIMIZED);
if Failed(InitDX(DXObj,DXDev,Wnd)) then Halt;
if Failed(D3DXCreateTeapot(DXDev,DXMesh,nil)) then Exit;
while True do
begin
 if PeekMessage(WndMsg,0,0,0,PM_REMOVE) then
 begin
  TranslateMessage(WndMsg);
  DispatchMessage(WndMsg);
 end
 else
 begin
  if Failed(OnIdle) then DoExit;
 end;
end;
end.


← →
ProgRAMmer Dimonych ©   (2007-06-22 01:18) [3]

AuxLib и DXAux - это чтобы не отвлекаться на процедуры инициализации//деинициализации во время работы с рендерингом.

unit AuxLib;

interface

uses Windows;

const
WndName="DXWindow";

function CreateMyCoolWindow(WinProc:Pointer):HWND;

implementation

function CreateMyCoolWindow(WinProc:Pointer):HWND;
var
WndClass:TWndClass;
begin
Result:=0;
with WndClass do
begin
 Style:=CS_VREDRAW or CS_HREDRAW;
 lpfnWndProc:=WinProc;
 cbClsExtra:=0;
 cbWndExtra:=0;
 hInstance:=0;
 hIcon:=LoadIcon(0,IDI_APPLICATION);
 hCursor:=LoadCursor(0,IDC_ARROW);
 hbrBackground:=NULL_BRUSH;
 lpszMenuName:=nil;
 lpszClassName:=WndName;
end;
if not Boolean(RegisterClass(WndClass)) then
begin
 MessageBox(0,"Ошибка регистрации класса!","Ошибка",MB_ICONERROR);
 Halt;
end
else
begin
 Result:=CreateWindow(WndName,WndName,WS_POPUP,0,0,500,500,0,0,hInstance,nil);
end;
end;

end.


unit DXAux;

interface

uses Direct3D9, Windows;

type
 TDXObj=IDirect3D9;
 TDXDev=IDirect3DDevice9;
 TDXVB=IDirect3DVertexBuffer9;
 TDXIB=IDirect3DIndexBuffer9;
 function InitDX(var DXObj:TDXObj; var DXDev:TDXDev; Window:HWND):HRESULT;
 procedure DeInitDX(var DXObj:TDXObj; var DXDev:TDXDev);

implementation

function InitDX(var DXObj:TDXObj; var DXDev:TDXDev; Window:HWND):HRESULT;
var
VP:Cardinal;
Caps:D3DCAPS9;
PP:D3DPRESENT_PARAMETERS;
begin
Result:=E_FAIL;
DeInitDX(DXObj,DXDev);
DXObj:=Direct3DCreate9(D3D_SDK_VERSION);
if DXObj=nil then Exit;
if Failed(DXObj.GetDeviceCaps(0,D3DDEVTYPE_HAL,Caps)) then Exit;
if Boolean(Caps.DevCaps and D3DDEVCAPS_HWTRANSFORMANDLIGHT) then
 VP:=D3DCREATE_HARDWARE_VERTEXPROCESSING
else
 VP:=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
ZeroMemory(@PP,SizeOf(PP));
PP.SwapEffect:=D3DSWAPEFFECT_DISCARD;
PP.Windowed:=True;
PP.EnableAutoDepthStencil:=True;
PP.AutoDepthStencilFormat:=D3DFMT_D16;
if Failed(DXObj.CreateDevice(0,D3DDEVTYPE_HAL,Window,VP,@PP,DXDev)) then Exit;
if Failed(DXDev.SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE)) then Exit;
if Failed(DXDev.SetRenderState(D3DRS_LIGHTING,Cardinal(False))) then Exit;
if Failed(DXDev.SetRenderState(D3DRS_CULLMODE,D3DCULL_CW)) then Exit;
Result:=D3D_OK;
end;

procedure DeInitDX(var DXObj:TDXObj; var DXDev:TDXDev);
begin
if Assigned(DXDev) then begin DXDev._Release; DXDev:=nil; end;
if Assigned(DXObj) then begin DXObj._Release; DXObj:=nil; end;
end;

end.


Чует моё сердце, что где-то совсем по-тупому лоханулся, но где..? Этот раз - самый удачный, до этого вообще ничего не рисовало, здесь всё рисует нормально (для заданного RenderState"а).


← →
Servelat ©   (2007-06-22 01:56) [4]

Для интерфейсов Release вызывать не нужно, ибо компилятор Делфи сам вставляет его вызов туда, где переменной присваивается nil (или при выходе за границы видимости, но обычно предпочитают ставить nil руками).


← →
db2admin ©   (2007-06-22 07:55) [5]

http://www.google.com/codesearch?as_q=Mesh&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%BA%D0%BE%D0%B4%D0%B0&hl=ru&as_lang=pascal&as_license_restrict=i&as_license=&as_package=&as_filenam e=&as_case=

новая услуга Гугла поиск кода



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.018 c
15-1182425919
Bless
2007-06-21 15:38
2007.07.22
Примеры распределенных приложений


15-1182836920
Руслан56
2007-06-26 09:48
2007.07.22
востановление *.DBF /////// HELP


1-1179396051
ancot
2007-05-17 14:00
2007.07.22
winexec


15-1182302301
SerJaNT
2007-06-20 05:18
2007.07.22
Firewall в Win2000 Server


2-1182939554
zvm
2007-06-27 14:19
2007.07.22
как проще сделать примитивную 3D графику?




   Наверх