13,825
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "mmsystem.h"
#include "d3dx9.h" // 修改:在Project->Options->C++ Compiler->Path and Defines中的Defines中添加“sqrtf=sqrt”
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPD3DXMESH g_teapot = NULL;
void InitGeometry(void);
void SetupMatrics(float XAngle);
void SetupLight(void);
void Render(void);
int gAngle;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// 初始化D3D9环境
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3ddp;
ZeroMemory(&d3ddp, sizeof(D3DPRESENT_PARAMETERS));
d3ddp.Windowed = TRUE;
d3ddp.SwapEffect = D3DSWAPEFFECT_DISCARD;
//d3ddp.BackBufferFormat = D3DFMT_UNKNOWN;
d3ddp.EnableAutoDepthStencil = TRUE;
d3ddp.AutoDepthStencilFormat = D3DFMT_D16;
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, this->Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3ddp, &g_pd3dDevice);
//g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
//g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
//g_pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
InitGeometry();
SetupLight();
gAngle = 0;
}
//---------------------------------------------------------------------------
void InitGeometry(void)
{
D3DXCreateTeapot(g_pd3dDevice, &g_teapot, NULL);
//D3DXCreateBox(g_pd3dDevice, 2, 2, 2, &g_teapot, NULL);
//D3DXCreateSphere(g_pd3dDevice, 1, 20, 20, &g_teapot, NULL);
//D3DXCreateTorus(g_pd3dDevice, 0.5f, 1.2f, 50, 50, &g_teapot, NULL);
}
//---------------------------------------------------------------------------
void SetupMatrics(float Angle)
{
// 世界矩阵
D3DXMATRIXA16 matWorld;
D3DXMatrixRotationX(&matWorld, Angle);
//D3DXMatrixRotationY(&matWorld, Angle);
//D3DXMatrixRotationZ(&matWorld, Angle);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
// 观察矩阵
D3DXVECTOR3 vEyePt(0.0, 3.0, -5.0);
D3DXVECTOR3 vLookatPt(0.0, 0.0, 0.0);
D3DXVECTOR3 vUpVec(0.0, 1.0, 0.0);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
// 透视投影矩阵
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4.0, 1.0, 0.0, 100.0);
//D3DXMatrixOrthoLH(&matProj, 10, 10, -100, 100);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
// 视区
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = Form1->Width;
vp.Height = Form1->Height;
vp.MinZ = 0;
vp.MaxZ = 1;
g_pd3dDevice->SetViewport(&vp);
}
//---------------------------------------------------------------------------
void SetupLight(void)
{
// 设置材质
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl, sizeof(D3DMATERIAL9));
mtrl.Diffuse.r = 1.0f;
mtrl.Diffuse.g = 0.8f;
mtrl.Diffuse.b = 0.7f;
mtrl.Diffuse.a = 1.0f;
mtrl.Ambient.r = 0.0f;
mtrl.Ambient.g = 0.8f;
mtrl.Ambient.b = 0.7f;
mtrl.Ambient.a = 1.0f;/**/
g_pd3dDevice->SetMaterial(&mtrl);
// 设置光源
D3DXVECTOR3 vecDir;
D3DLIGHT9 light;
ZeroMemory(&light, sizeof(D3DLIGHT9));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
vecDir = D3DXVECTOR3(1, 1, 1);
D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, &vecDir);
light.Range = 1000.0f;
HRESULT hr = g_pd3dDevice->SetLight(0, &light);
g_pd3dDevice->LightEnable(0, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);/**/
D3DXVECTOR3 vecPos2;
D3DLIGHT9 light2;
ZeroMemory(&light2, sizeof(D3DLIGHT9));
light2.Type = D3DLIGHT_POINT;
light2.Diffuse.r = 0.9f;
light2.Diffuse.g = 0.0f;
light2.Diffuse.b = 0.0f;
light2.Position = D3DXVECTOR3(3, 2, 1);
light2.Range = 100.0f;
light2.Attenuation0 = 1.0f;
//g_pd3dDevice->SetLight(1, &light2);
//g_pd3dDevice->LightEnable(1, TRUE);
//g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
// 设置环境光
//g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
}
//---------------------------------------------------------------------------
void Render(void)
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(128, 128, 128), 1.0, 0);
g_pd3dDevice->BeginScene();
gAngle++;
SetupMatrics(gAngle*D3DX_PI/180.0);
g_teapot->DrawSubset(0);
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Render();
Caption = gAngle;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
g_teapot->Release();
g_pd3dDevice->Release();
g_pD3D->Release();
}
//---------------------------------------------------------------------------