Форум: "Игры";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
ВнизВопрос к знатокам Direct3D Найти похожие ветки
← →
Ricks (2002-12-30 14:08) [0]Люди, ПОЖАЙЛУСТА!, помогите. Я я делаю так, как описано в примерах, те
TCustomVertex = record
Positon : TD3dVetor;
Diffuse : TD3dColor;
end
const
D3dfvf_custom = d3dfvf_XYX or D3dfvf_Diffuse;
итд...
но при прорисовке, у меня получаются только черные треугольники, а как их сделать цветными??? Извините, если вопрос поставлен не правильно, но все-же если кто понял чего я хочу, ответьте, ПОЖАЙЛУСТА!!!
← →
Ev_genus (2002-12-30 18:19) [1]Давай весь код. Я думаю проблема в параметрах рендеринга
← →
Nemi (2003-01-04 16:45) [2]А мне кажеться Ricks не понимает что на одних чужих премерах без литературы не выжить, пусть читает книги.
← →
Mitrofan (2003-01-04 18:07) [3]Отключи освещение.
← →
Ricks (2003-01-06 23:18) [4]Спасибо, что отеветили, так вот:
> Ev_genus
type
TCustomVertex = record
Pos : TD3DVector;
Diff : TD3DColor;
end;
var
Form1 : TForm1;
Dir : IDirect3D8;
Dev : IDirect3DDevice8;
VertBuf : IDirect3DVertexBuffer8;
Y, X : Single;
MatrW : TD3DMatrix;
MatrV : TD3DMatrix;
MatrP : TD3DMatrix;
const
CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_DIFFUSE;
implementation
{$R *.dfm}
procedure TForm1.Render;
var C:COLORREF;
begin
C:=ColorToRGB(Color);
C:=RGB(Byte(C shr 16), Byte(C shr 8), Byte(C));
Dev.Clear(0, nil, D3DCLEAR_TARGET, C, 1.0, 0);
Dev.BeginScene;
D3DXMatrixRotationX(MatrW, X);
Dev.SetTransform(D3DTS_WORLD, MatrW);
Dev.SetStreamSource(0, VertBuf, SizeOf(TCustomVertex));
Dev.SetVertexShader(CUSTOMVERTEX);
Dev.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
Dev.EndScene;
Dev.Present(nil, nil, 0, nil);
Inc(FPS);
end;
procedure TForm1.FormCreate(Sender: TObject);
var DM : TD3DDisplayMode;
PS : TD3DPresentParameters;
Verts : array[0..5] of TCustomVertex;
lpVerts : PByte;
E, A, U : TD3DVector;
begin
Dir:=Direct3DCreate8(D3D_SDK_VERSION);
if not Assigned(Dir) then Halt(1);
Dir._AddRef;
FillChar(DM, SizeOf(TD3DDisplayMode), 0);
FillChar(PS, SizeOf(TD3DPresentParameters), 0);
Dir.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DM);
with PS do begin
Windowed:=true;
SwapEffect:=D3DSWAPEFFECT_FLIP;
BackBufferFormat:=DM.Format;
end;
Dir.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, PS, Dev);
if not Assigned(Dev) then begin
Dir._Release;
Halt(2);
end;
Dev._AddRef;
Dev.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
// Dev.SetRenderState(D3DRS_AMBIENT, $FF00FF);
Dev.CreateVertexBuffer(SizeOf(Verts), 0, CUSTOMVERTEX, D3DPOOL_DEFAULT, VertBuf);
if not Assigned(VertBuf) then begin
Dev._Release;
Dir._Release;
Halt(3);
end;
FillChar(Verts, SizeOf(Verts), 0);
Verts[0].Pos:=D3DXVector3(-1, -1, 0); Verts[0].Diff:=$FF0000FF;
Verts[1].Pos:=D3DXVector3(-1, 1, 0); Verts[1].Diff:=$00FF00FF;
Verts[2].Pos:=D3DXVector3( 1, 1, 0); Verts[2].Diff:=$0000FFFF;
Verts[3].Pos:=D3DXVector3( 1, 1, 0); Verts[3].Diff:=$FF0000FF;
Verts[4].Pos:=D3DXVector3(-1, -1, 0); Verts[4].Diff:=$00FF00FF;
Verts[5].Pos:=D3DXVector3( 1, -1, 0); Verts[5].Diff:=$0000FFFF;
VertBuf.Lock(0, SizeOf(Verts), lpVerts, 0);
CopyMemory(lpVerts, @Verts, SizeOf(Verts));
VertBuf.Unlock;
E:=D3DXVector3(0, 0, -10);
A:=D3DXVector3(0, 0, 0);
U:=D3DXVector3(0, 1, 0);
D3DXMatrixLookAtLH(MatrV, E, A, U);
D3DXMatrixPerspectiveFovLH(MatrP, PI / 4, ClientWidth / ClientHeight, 1, 100);
Dev.SetTransform(D3DTS_VIEW, MatrV);
Dev.SetTransform(D3DTS_PROJECTION, MatrP);
Application.OnIdle:=AppIdle;
end;
> Nemi
У меня есть SDK по DirectX, так вот, там написано тоже самое, тоькоD3D_CUSTOMVERTEX = D3D_XYZRHW or D3D_DIFFUE
так работает, а без RHW не работает :-(
← →
Ev_genus (2003-01-07 18:56) [5]Ну блин. Всё давай - весь юнит. Как я это запустить смогу?!
← →
Ev_genus (2003-01-07 19:06) [6]Вот тебе рабочее кодево.
{******************************************************************************}
{* Иллюстрация к книге "DirectX. Графика в проектах Delphi". *}
{* Издательство BHV. www.bhv.ru *}
{* Краснов М.В. softgl@chat.ru *}
{******************************************************************************}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AppEvnts,
DirectXGraphics, DXGUtils;
type
TfrmD3D = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Minimize(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ApplicationEvents1Restore(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FD3D : IDIRECT3D8;
FD3DDevice : IDIRECT3DDEVICE8;
FD3DVB : IDIRECT3DVERTEXBUFFER8;
FActive : BOOL;
ThisTickCount : DWORD;
LastTickCount : DWORD;
function Render : HRESULT;
function InitD3D : HRESULT;
function InitVB : HRESULT;
procedure DrawScene;
procedure Cleanup;
procedure ErrorOut (const Caption : PChar; const hError : HRESULT);
public
{ Public declarations }
end;
type
TCUSTOMVERTEX = packed record
X, Y, Z : Single;
Color : DWORD;
end;
const
D3DFVF_CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_DIFFUSE;
var
frmD3D: TfrmD3D;
Frames : Integer = 0;
Angle : Single = 0.0;
implementation
{$R *.DFM}
procedure TfrmD3D.Cleanup;
begin
if Assigned (FD3DVB) then begin
FD3DVB._Release;
FD3DVB := nil;
end;
if Assigned (FD3DDevice) then begin
FD3DDevice._Release;
FD3DDevice := nil;
end;
if Assigned (FD3D) then begin
FD3D._Release;
FD3D := nil;
end;
end;
procedure TfrmD3D.ErrorOut (const Caption : PChar; const hError : HRESULT);
begin
FActive := False;
Cleanup;
MessageBox (Handle, PChar(DXGErrorString (hError)), Caption, 0);
end;
function TfrmD3D.InitD3D : HRESULT;
var
d3ddm : TD3DDISPLAYMODE;
d3dpp : TD3DPRESENT_PARAMETERS;
hRet : HRESULT;
begin
FD3DDevice := nil;
FD3DVB := nil;
FD3D := nil;
FD3D := Direct3DCreate8(D3D_SDK_VERSION);
if FD3D = nil then begin
Result := E_FAIL;
Exit;
end;
hRet := FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, d3ddm);
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
ZeroMemory(@d3dpp, SizeOf(d3dpp));
with d3dpp do begin
Windowed := True;
SwapEffect := D3DSWAPEFFECT_DISCARD;
BackBufferFormat := d3ddm.Format;
end;
Result := FD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
d3dpp, FD3DDevice);
end;
← →
Ev_genus (2003-01-07 19:21) [7]function TfrmD3D.Render : HRESULT;
var
hRet : HRESULT;
begin
if FD3DDevice = nil then begin
Result := E_FAIL;
Exit;
end;
hRet := FD3DDevice.Clear(0, nil, D3DCLEAR_TARGET, $00FFFFFF,
0.0, 0);
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DDevice.BeginScene;
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
with FD3DDevice do begin
SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
SetRenderState(D3DRS_LIGHTING, DWORD (False));
end;
DrawScene;
hRet := FD3DDevice.EndScene;
if FAILED(hRet) then begin
Result := hRet;
Exit;
end;
Result := FD3DDevice.Present(nil, nil, 0, nil);
end;
procedure TfrmD3D.FormCreate(Sender: TObject);
var
hRet : HRESULT;
begin
hRet := InitD3D;
if Failed (hRet) then ErrorOut ("InitD3D", hRet);
hRet := InitVB;
if Failed (hRet) then ErrorOut ("InitVertex", hRet);
end;
procedure TfrmD3D.ApplicationEvents1Minimize(Sender: TObject);
begin
FActive := False;
end;
procedure TfrmD3D.FormActivate(Sender: TObject);
begin
LastTickCount := GetTickCount;
FActive := True;
end;
procedure TfrmD3D.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
var
hRet : HRESULT;
begin
if FActive then begin
Inc (Frames);
hRet := Render;
if FAILED(hRet) then begin
FActive := False;
ErrorOut ("Render", hRet);
Exit;
end;
ThisTickCount := GetTickCount;
if ThisTickCount - LastTickCount > 15 then begin
Caption := "FPS = " + Format("%6.2f",
[frames * 1000 / (ThisTickCount - LastTickCount)]);
Frames := 0;
Angle := Angle + 0.05;
if Angle > 2 * Pi then Angle := Angle - 2 * Pi;
LastTickCount := GetTickCount;
end;
end;
Done := False;
end;
procedure TfrmD3D.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_ESCAPE then Close;
end;
procedure TfrmD3D.ApplicationEvents1Restore(Sender: TObject);
begin
FActive := True;
end;
procedure TfrmD3D.FormDestroy(Sender: TObject);
begin
Cleanup
end;
function TfrmD3D.InitVB : HRESULT;
var
Vertices : ^TCustomVertex;
hRet : HRESULT;
begin
hRet := FD3DDevice.CreateVertexBuffer(7 * SizeOf(TCustomVertex), 0,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, FD3DVB);
if Failed(hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DDevice.SetStreamSource(0, FD3DVB, SizeOf(TCustomVertex));
if Failed(hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);
if Failed(hRet) then begin
Result := hRet;
Exit;
end;
hRet := FD3DVB.Lock(0, 7 * SizeOf(TCustomVertex), PByte(Vertices), 0);
if Failed(hRet) then begin
Result := hRet;
Exit;
end;
Vertices.X := 0.0;
Vertices.Y := 1.0;
Vertices.Z := 0.0;
Vertices.Color := $00FF0000;
Inc(Vertices);
Vertices.X := 1.0;
Vertices.Y := -1.0;
Vertices.Z := 0.0;
Vertices.Color := $0000FF00;
Inc(Vertices);
Vertices.X := -1.0;
Vertices.Y := -1.0;
Vertices.Z := 0.0;
Vertices.Color := $000000FF;
Inc(Vertices);
Vertices.X := -1.0;
Vertices.Y := -1.0;
Vertices.Z := 0.0;
Vertices.Color := $00FFFF00;
Inc(Vertices);
Vertices.X := -1.0;
Vertices.Y := 1.0;
Vertices.Z := 0.0;
Vertices.Color := $00FFFF00;
Inc(Vertices);
Vertices.X := 1.0;
Vertices.Y := -1.0;
Vertices.Z := 0.0;
Vertices.Color := $00FFFF00;
Inc(Vertices);
Vertices.X := 1.0;
Vertices.Y := 1.0;
Vertices.Z := 0.0;
Vertices.Color := $00FFFF00;
Result := FD3DVB.Unlock;
end;
procedure TfrmD3D.DrawScene;
var
matView, matProj : TD3DMatrix;
matRotate, matTranslate : TD3DMatrix;
begin
SetRotateXMatrix(matRotate, Angle);
SetTranslateMatrix(matTranslate, -1.0, 0.0, 0.0);
FD3DDevice.SetTransform(D3DTS_WORLD, MatrixMul(matRotate, matTranslate));
FD3DDevice.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
SetRotateYMatrix(matRotate, 2 * Angle);
SetTranslateMatrix(matTranslate, 1.0, 0.0, 0.0);
FD3DDevice.SetTransform(D3DTS_WORLD, MatrixMul(matTranslate, matRotate));
FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 3, 2);
SetViewMatrix(matView, D3DVector(0, 0, -5), D3DVector(0, 0, 0), D3DVector(0, 1, 0));
FD3DDevice.SetTransform(D3DTS_VIEW, matView);
SetProjectionMatrix(matProj, 1, 1, 1, 10);
FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);
end;
end.
← →
Ricks (2003-01-08 13:43) [8]Спасибо, попробую.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c