`
- 浏览:
21447396 次
- 性别:
- 来自:
杭州
-
#include<d3dx9.h>
#pragmacomment(lib,"d3d9.lib")
#pragmacomment(lib,"d3dx9.lib")
#pragmacomment(lib,"winmm.lib")
D3DXVECTOR3CubeLookAt[]=
{
D3DXVECTOR3(0.0f,-30.0f,-30.0f),
D3DXVECTOR3(0.0f,0.0f,0.0f),
D3DXVECTOR3(0.0f,1.0f,0.0f)
};
LPDIRECT3D9g_pD3D=NULL;//Direct3D对象
LPDIRECT3DDEVICE9g_pD3DDevice=NULL;//Direct3D设备对象
LPDIRECT3DVERTEXBUFFER9g_pVertexBuffer=NULL;//Buffertoholdvertices
PDIRECT3DTEXTURE9g_pTexture=NULL;//纹理指针
LPD3DXMESHg_pMesh=NULL;//网格模型对象
D3DMATERIAL9*g_pMeshMaterials=NULL;//网格模型材质
LPDIRECT3DTEXTURE9*g_pMeshTextures=NULL;//网格模型纹理
DWORDg_dwNumMaterials=0L;//网格模型材质数量
structCUSTOMVERTEX//自定义的顶点格式
{
FLOATx,y,z;//顶点坐标
DWORDcolor;//顶点颜色
FLOATtu,tv;//纹理坐标
};
//FlexibleVertexFormat(FVF)灵活顶点格式
#defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
//释放对象
#defineSafeRelease(pObject)if(pObject!=NULL){pObject->Release();pObject=NULL;}
//释放对象数组
#defineSafeDelete(pObjectArray)if(pObjectArray!=NULL){delete[]pObjectArray;}
//键盘控制
#defineKeyDown(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?1:0)
#defineKeyUp(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?0:1)
/**************************************************************
*Desc:初始化Direct3D
**************************************************************/
HRESULTInitialiseD3D(HWNDhWnd)
{
//Firstofall,createthemainD3Dobject.Ifitiscreatedsuccessfullywe
//shouldgetapointertoanIDirect3D8interface.
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D==NULL)
{
returnE_FAIL;
}
//Getthecurrentdisplaymode
/*D3DDISPLAYMODEd3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
returnE_FAIL;
}*/
//Createastructuretoholdthesettingsforourdevice
D3DPRESENT_PARAMETERSd3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
//Fillthestructure.
//Wewantourprogramtobewindowed,andsetthebackbuffertoaformat
//thatmatchesourcurrentdisplaymode
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
//深度缓冲
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
d3dpp.EnableAutoDepthStencil=TRUE;
//CreateaDirect3Ddevice.
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,
&g_pD3DDevice)))
{
returnE_FAIL;
}
//开启背面拣选
//g_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
//去除灯光
//g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
//激活深度缓冲
//g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
//设置环境灯光
g_pD3DDevice->SetRenderState(D3DRS_AMBIENT,0xFFFFFFFF);
returnS_OK;
}
/**************************************************************
*Desc:初始化顶点缓冲(立方体)
**************************************************************/
HRESULTInitVertexBuffer()
{
VOID*pVertices;
//Storeeachpointofthecubetogetherwithit'scolour
//Makesurethatthepointsofapolygonarespecifiedinaclockwisedirection,
//thisisbecauseanti-clockwisefaceswillbeculled
//Wewilluseathreetrianglestripstorenderthesepolygons
//(Top,Sides,Bottom).
CUSTOMVERTEXcvVertices[]=
{
//TopFace
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),0.0f,1.0f},//Vertex0-Blue
{-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0),0.0f,0.0f},//Vertex1-Red
{5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),1.0f,1.0f},//Vertex2-Red
{5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),1.0f,0.0f},//Vertex3-Green
//Face1
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),0.0f,1.0f},//Vertex4-Red
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),0.0f,0.0f},//Vertex5-Blue
{5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0),1.0f,1.0f},//Vertex6-Green
{5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),1.0f,0.0f},//Vertex7-Red
//Face2
{5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255),0.0f,1.0f},//Vertex8-Blue
{5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),0.0f,0.0f},//Vertex9-Green
//Face3
{-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),1.0f,1.0f},//Vertex10-Green
{-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0),1.0f,0.0f},//Vertex11-Red
//Face4
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),0.0f,1.0f},//Vertex12-Red
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),0.0f,0.0f},//Vertex13-Blue
//BottomFace
{5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0),0.0f,1.0f},//Vertex14-Green
{5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255),0.0f,0.0f},//Vertex15-Blue
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),1.0f,1.0f},//Vertex16-Red
{-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),1.0f,0.0f},//Vertex17-Green
};
//Createthetexturefromfile
if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,"1.bmp",&g_pTexture)))
{
returnE_FAIL;
}
//Createthevertexbufferfromourdevice.
if(FAILED(g_pD3DDevice->CreateVertexBuffer(18*sizeof(CUSTOMVERTEX),
0,D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL)))
{
returnE_FAIL;
}
//Getapointertothevertexbufferverticesandlockthevertexbuffer
if(FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(void**)&pVertices,0)))
{
returnE_FAIL;
}
//Copyourstoredverticesvaluesintothevertexbuffer
memcpy(pVertices,cvVertices,sizeof(cvVertices));
//Unlockthevertexbuffer
g_pVertexBuffer->Unlock();
returnS_OK;
}
/**************************************************************
*Desc:响应键盘事件
**************************************************************/
VOIDProcInput()
{
if(KeyDown(VK_DOWN))
{
CubeLookAt[0].z-=0.2f;
CubeLookAt[1].z-=0.2f;
}
if(KeyDown(VK_UP))
{
CubeLookAt[0].z+=0.2f;
CubeLookAt[1].z+=0.2f;
}
if(KeyDown(VK_RIGHT))
{
CubeLookAt[1].x+=0.2f;
}
if(KeyDown(VK_LEFT))
{
CubeLookAt[1].x-=0.2f;
}
}
/**************************************************************
*Desc:初始化网格模型
**************************************************************/
HRESULTInitMesh()
{
LPD3DXBUFFERpMaterialsBuffer;
//从磁盘文件加载网格模型
if(FAILED(D3DXLoadMeshFromX("SKULL.x",D3DXMESH_MANAGED,g_pD3DDevice,NULL,
&pMaterialsBuffer,NULL,&g_dwNumMaterials,&g_pMesh)))
{
MessageBox(NULL,"Couldnotfindcorrespondingmeshfile","Mesh",MB_OK);
returnE_FAIL;
}
//从网格模型中提取材质属性和纹理文件名
D3DXMATERIAL*matMaterials=(D3DXMATERIAL*)pMaterialsBuffer->GetBufferPointer();
//Createtwoarrays.Onetoholdthematerialsandothertoholdthetextures
g_pMeshMaterials=newD3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures=newLPDIRECT3DTEXTURE9[g_dwNumMaterials];
//逐块提取网格模型材质属性和纹理文件名
for(DWORDi=0;i<g_dwNumMaterials;i++)
{
//材料属性
g_pMeshMaterials[i]=matMaterials[i].MatD3D;
//设置模型材料的环境光反射系数,因为模型材料本身没有设置
g_pMeshMaterials[i].Ambient=g_pMeshMaterials[i].Diffuse;
//创建纹理
if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,
matMaterials[i].pTextureFilename,
&g_pMeshTextures[i])))
{
g_pMeshTextures[i]=NULL;
}
}
//We'vefinishedwiththematerialbuffer,soreleaseit
SafeRelease(pMaterialsBuffer);
returnS_OK;
}
/**************************************************************
*Desc:渲染立方体
**************************************************************/
voidRenderCube()
{
ProcInput();
/****************************
*Desc:创建并设置世界矩阵*
****************************/
D3DXMATRIXmatWorld,matWorldX,matWorldY,matWorldZ;
//Createthetransformationmatrices
D3DXMatrixRotationX(&matWorldX,timeGetTime()/400.0f);
D3DXMatrixRotationY(&matWorldY,timeGetTime()/400.0f);
D3DXMatrixRotationZ(&matWorldZ,timeGetTime()/400.0f);
/*我们调用了D3DXMatrixRotationX、D3DXMatrixRotationY和D3DXMatrixRotationZ
函数产生了3个矩阵而且分别将它们保存在了3个D3DXMATRIX结构中
然后我们将它们相乘后形成了世界矩阵*/
D3DXMatrixMultiply(&matWorld,&matWorldX,&matWorldY);
D3DXMatrixMultiply(&matWorld,&matWorld,&matWorldZ);
//我们又调用了SetTransform函数为我们的顶点应用了此变换
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
/****************************
*Desc:创建并设置观察矩阵*
****************************/
D3DXMATRIXmatView;
D3DXMatrixLookAtLH(&matView,&CubeLookAt[0],//CameraPosition
&CubeLookAt[1],//LookAtPosition
&CubeLookAt[2]);//UpDirection
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
/****************************
*Desc:创建并设置投影矩阵*
****************************/
D3DXMATRIXmatProj;
/*我们设置摄像机的镜头:我们确定了视界为PI/4(正常)而横纵比为1
我们还确定了前、后裁剪平面分别为1和500,这意味着范围之外的三角形将会被裁剪掉*/
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,500.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
//Sethowthetextureshouldberendered.
if(g_pTexture!=NULL)
{
//Atexturehasbeenset.Wedon'twanttoblendourtexturewith
//thecoloursofourvertices,souseD3DTOP_SELECTARG1
g_pD3DDevice->SetTexture(0,g_pTexture);
g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
}
else
{
//Notexturehasbeenset.Sowewilldisabletexturerendering.
g_pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE);
}
//Renderingourobjects
g_pD3DDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);//Top
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);//Sides
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);//Bottom
}
/**************************************************************
*Desc:渲染网格模型
**************************************************************/
DWORDRenderMesh()
{
//创建并设置世界坐标系
D3DXMATRIXmatWorld;
D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
//创建并设置观察矩阵
D3DXMATRIXmatView;
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f,0.0f,-20.0f),
&D3DXVECTOR3(0.0f,0.0f,0.0f),
&D3DXVECTOR3(0.0f,1.0f,0.0f));
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
//创建并设置投影矩阵
D3DXMATRIXmatProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
//逐块渲染网格模型
if(g_pMesh!=NULL)
{
for(DWORDi=0;i<g_dwNumMaterials;i++)
{
g_pD3DDevice->SetMaterial(&g_pMeshMaterials[i]);
g_pD3DDevice->SetTexture(0,g_pMeshTextures[i]);
g_pMesh->DrawSubset(i);
}
returng_pMesh->GetNumFaces();
}
else
{
MessageBox(NULL,"Couldnotopenmeshfile","Mesh",MB_OK);
return0;
}
}
/**************************************************************
*Desc:渲染主场景
**************************************************************/
voidRender()
{
if(g_pD3DDevice==NULL)
{
return;
}
//清空深度缓冲
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//Beginthescene
g_pD3DDevice->BeginScene();
//RenderCube();
RenderMesh();
//Endthescene
g_pD3DDevice->EndScene();
//Filpthebackandfrontbufferssothatwhateverhasbeenrenderedonthe
//backbufferwillnowbevisibleonscreen(frontbuffer).
g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}
/**************************************************************
*Desc:释放对象
**************************************************************/
voidCleanUp()
{
SafeDelete(g_pMeshMaterials);
if(g_pMeshTextures!=NULL)
{
for(DWORDi=0;i<g_dwNumMaterials;i++)
{
if(g_pMeshTextures[i])
{
SafeRelease(g_pMeshTextures[i]);
}
}
}
SafeDelete(g_pMeshTextures);
SafeRelease(g_pMesh);
SafeRelease(g_pTexture);
SafeRelease(g_pVertexBuffer);
SafeRelease(g_pD3DDevice);
SafeRelease(g_pD3D);
}
/**************************************************************
*Desc:游戏循环
**************************************************************/
voidGameLoop()
{
//Enterthegameloop
MSGmsg;
BOOLfMessage;
PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
while(msg.message!=WM_QUIT)
{
fMessage=PeekMessage(&msg,NULL,0U,0U,PM_REMOVE);
if(fMessage)
{
//Processmessage
TranslateMessage(&msg);//将虚拟键消息转换为字符消息
DispatchMessage(&msg);//将转换后的消息传送给windows
}
else
{
//Nomessagetoprocess,sorenderthecurrentscene
Render();
}
}
}
/**************************************************************
*Desc:消息处理函数
**************************************************************/
LRESULTWINAPIWinProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
{
switch(msg)
{
caseWM_DESTROY:
PostQuitMessage(0);
return0;
break;
caseWM_KEYUP:
switch(wParam)
{
caseVK_ESCAPE:
//Userhaspressedtheescapekey,soquit
DestroyWindow(hWnd);
return0;
break;
}
break;
}
returnDefWindowProc(hWnd,msg,wParam,lParam);//调用默认消息处理过程
}
/**************************************************************
*Desc:WIN32入口函数
**************************************************************/
INTWINAPIWinMain(HINSTANCEhInst,HINSTANCE,LPSTR,INT)
{
//Registerthewindowclass
/*WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
"DXProject3",NULL};*/
WNDCLASSEXwc;
//指定了结构的大小
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_CLASSDC;
//指定窗口类别的消息处理函数
wc.lpfnWndProc=WinProc;
//指定窗口结构的额外空间
wc.cbClsExtra=</
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
DirectX 3D 例程,图形与动画程序设计
C#directX3D例程,程序用于飞机模型的3D显示和姿态变化,其中有鼠标点击滑动引起姿态变化和trackBar引起的姿态变化
DirectX支持库例程.rar
易语言DirectX支持库例程源码,DirectX支持库例程,调用鼠标图片,SetClassLong
dx9_2d_demo_game directx9实现2D游戏例程 是一个用Direct9 写的一个2D 飞机游戏
易语言源码DirectX支持库例程--.rar
易语言DirectX支持库例程.zip易语言项目例子源码下载易语言DirectX支持库例程.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考
第9章 字体\t 第10章 网格(一)\t 第11章 网格(二)\t 第12章 设计一个灵活的Camera类 第13章 地形绘制基础\t 第14章 粒子系统\t 第15章 拾取\t 第Ⅳ部分 着色器和效果 第16章 高级着色语言(HLSL)入门\t 第17章 顶点...
易语言源码DirectX支持库例程.7z
资源介绍:。例程源码是演示时钟下判断按键状态,移动位图块,从而掩饰了易语言DirectX支持库的功能。资源作者:。百度云源码下载。资源界面:。资源下载:。
directx11的官方C++例程
就是那个很有名的生命游戏了.以前速度跟不上.做的小.这次做的大一些.默认速度是最快.可能看不清.请建立一个快捷方式.后边跟上数值就可以变慢了.数值只取第一个,单位是毫秒.软件运行时可按键随机...Tags:DirectX例程。
directx9实现纹理过滤例程
在例程Cube的基础上,完成以下步骤: 1)实现平行光照明。 2)黄色材质设定。 3)增加一个红色点光源。 4)实现材质设定的透明度,实现50%透明度。 在实验过程中注意灯光设置的方向、颜色等参数设定。 项目2: ...
DirectX 9.0 3D游戏开发编程基础 例程 !!!!!
网上有不少利用UpdateLayeredWindow函数实现半透明窗体的例程甚至源码,但是大部分是使用GDI+实现的。有人提到了使用DirectX,我在Sineysoft Studio网站上看到了siney将此技术实现了,而且还给出了具体步骤,只不过...
《DIRECTX.9.0.3D游戏开发编程基础》以及例程源代码,有详细的书签,便于阅读。
DirectX例程 这是Windows官方提供的DirectX例程 希望能给喜欢DirectX的朋友带来帮助