Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.12;
Скачать: CL | DM;

Вниз

Вопрос к знатокам 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
14-35072
Инна
2003-05-27 17:58
2003.06.12
Ошибка Access Violation at address...


3-34711
Ann
2003-05-22 09:10
2003.06.12
кодировка


3-34675
Weare
2003-05-22 14:05
2003.06.12
Работа с CashedUpdates


11-34764
VEG
2002-09-20 20:54
2003.06.12
OCX


3-34734
Kirill_S
2003-05-22 14:21
2003.06.12
DAT файлы