#include <windows.h>
#include <d3dx9.h>
#include <vector>
using namespace std;
HINSTANCE hInstance;
IDirect3DDevice9 *Device = 0;
const D3DXCOLOR WHITE( D3DCOLOR_XRGB(255, 255, 255) );
//设置全局变量,一个ID3DXMesh对象存储从XFile中加载的网格数据,另外两个变量分别存储该网格的材质和纹理数据
ID3DXMesh *Mesh = 0;
vector<D3DMATERIAL9>Mtrls(0);
vector<IDirect3DTexture9*>Textures(0);
bool Setup()
{
//导入XFile数据
ID3DXBuffer* adjBuffer = 0;
ID3DXBuffer* mtrlBuffer = 0;
DWORD numMtrls = 0;
D3DXLoadMeshFromX("bigship1.x", D3DXMESH_MANAGED, Device, &adjBuffer, &mtrlBuffer, 0, &numMtrls, &Mesh);
//加载XFile文件后,我们必须遍历D3DXMATRIAL数组中的元素,并加载该网格所引用的纹理数据
if(mtrlBuffer!=0 && numMtrls!=0)
{
D3DXMATERIAL *mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();
for(int i=0; i<numMtrls; i++)
{
//设置MatD3D的属性
mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
//保存第i个材质
Mtrls.push_back(mtrls[i].MatD3D);
//检查第i个材质是否有纹理
if(mtrls[i].pTextureFilename != 0)
{
//是的话导入纹理信息
IDirect3DTexture9* tex = 0;
D3DXCreateTextureFromFile(Device, mtrls[i].pTextureFilename, &tex);
//保存导入的纹理
Textures.push_back(tex);
}
else
{
//不是的话
Textures.push_back(0);
}
}
}
Mesh->OptimizeInplace(
D3DXMESHOPT_ATTRSORT |
D3DXMESHOPT_COMPACT |
D3DXMESHOPT_VERTEXCACHE,
(DWORD*)adjBuffer->GetBufferPointer(),
0, 0, 0);
//
// Set texture filters.
//
Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
//
// Set Lights.
//
D3DLIGHT9 dir;
ZeroMemory(&dir, sizeof(dir));
dir.Type = D3DLIGHT_DIRECTIONAL;
dir.Diffuse = WHITE;
dir.Specular = WHITE * 0.3f;
dir.Ambient = WHITE * 0.6f;
dir.Direction = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
//
// Set and Enable the light.
//
Device->SetLight(0, &dir);
Device->LightEnable(0, true);
//
// Set camera.
//
D3DXVECTOR3 pos(4.0f, 4.0f, -13.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(
&V,
&pos,
&target,
&up);
Device->SetTransform(D3DTS_VIEW, &V);
//
// Set projection matrix.
//
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f, // 90 - degree
800.0f/600.0f,
1.0f,
1000.0f);
Device->SetTransform(D3DTS_PROJECTION, &proj);
return true;
}
void Cleanup()
{
}
void Display(float time)
{
if(Device)
{
static float y = 0.0f;
D3DXMATRIX yRot;
D3DXMatrixRotationY(&yRot, y);
y = y + time;
if(y>6.28f)
y = 0.0f;
D3DXMATRIX World = yRot;
Device ->SetTransform(D3DTS_WORLD, &World);
Device ->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x0000ffff, 1.0f, 0);
Device ->BeginScene();
for(int i=0; i<Mtrls.size(); i++)
{
Device ->SetMaterial(&Mtrls[i]);
Device ->SetTexture(0, Textures[i]);
Mesh ->DrawSubset(i);
}
Device ->EndScene();
Device ->Present(0, 0, 0, 0);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
if( wParam == VK_ESCAPE )
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
MSG msg;
ZeroMemory(&msg, sizeof(msg));
WNDCLASSEX wc;
wc.cbClsExtra = NULL;
wc.cbSize = sizeof(wc);
wc.cbWndExtra = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hIconSm = NULL;
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "draw";
wc.lpszMenuName = NULL;
wc.style = CS_DROPSHADOW;
RegisterClassEx(&wc);
HWND hWnd = CreateWindowEx(WS_EX_COMPOSITED, "draw", "draw", WS_HSCROLL, 100, 100, 800, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, SW_NORMAL);
UpdateWindow(hWnd);
IDirect3D9 *D3D9 = 0;
D3D9 = Direct3DCreate9(D3D_SDK_VERSION);
D3DCAPS9 caps;
D3D9 ->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
HRESULT hr = D3D9-> CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
vp,
&d3dpp,
&Device);
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Setup();
Display(0.016f);
}
}
return 0;
}
DX加载.x文件实例
最新推荐文章于 2016-09-23 17:46:31 发布