Форум: "Прочее";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
ВнизИ снова 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.dprprogram 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 вся ветка
Форум: "Прочее";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c