Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.007 c
8-34942
KA_
2002-12-23 08:59
2003.06.12
Вейвлет-анализ изображений


14-34969
N119
2003-05-28 13:18
2003.06.12
LOL! Кошки чудят.


7-35087
Павел
2003-04-10 07:13
2003.06.12
Explorer


1-34856
oleg_SYS
2003-05-29 22:28
2003.06.12
Как выловить события onMouseIn и onMouseOut?


14-35050
mox
2003-05-27 20:48
2003.06.12
Перезагрузка Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский