DirectX示例--顶点雾化

2008061301.jpg

None.gif // =============================================================================
None.gif
// Desc:顶点雾化效果
None.gif
// =============================================================================
None.gif
#include < d3dx9.h >
None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// 全局变量
None.gif
// -----------------------------------------------------------------------------
None.gif
LPDIRECT3D9g_pD3D = NULL; // Direct3D对象
None.gif
LPDIRECT3DDEVICE9g_pd3dDevice = NULL; // Direct3D设备对象
None.gif

None.gifLPD3DXMESHg_pMesh
= NULL; // 网格模型对象
None.gif
D3DMATERIAL9 * g_pMeshMaterials = NULL; // 网格模型材料
None.gif
LPDIRECT3DTEXTURE9 * g_pMeshTextures = NULL; // 网格模型纹理
None.gif
DWORDg_dwNumMaterials = 0L ; // 网格模型子块数量
None.gif
None.gif
None.gif
// ----------------------------------------------------------------------------
None.gif
// Desc:
None.gif
// ----------------------------------------------------------------------------
None.gif
inlineFLOATHeightField(FLOATx,FLOATz)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifFLOATy
=0.0f;
InBlock.gify
+=10.0f*cosf(0.051f*x+0.0f)*sinf(0.055f*x+0.0f);
InBlock.gify
+=10.0f*cosf(0.053f*z+0.0f)*sinf(0.057f*z+0.0f);
InBlock.gify
+=2.0f*cosf(0.101f*x+0.0f)*sinf(0.105f*x+0.0f);
InBlock.gify
+=2.0f*cosf(0.103f*z+0.0f)*sinf(0.107f*z+0.0f);
InBlock.gify
+=2.0f*cosf(0.251f*x+0.0f)*sinf(0.255f*x+0.0f);
InBlock.gify
+=2.0f*cosf(0.253f*z+0.0f)*sinf(0.257f*z+0.0f);
InBlock.gif
returny;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:初始化Direct3D
None.gif
// -----------------------------------------------------------------------------
None.gif
HRESULTInitD3D(HWNDhWnd)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//创建Direct3D对象,该对象用来创建Direct3D设备对象
InBlock.gif
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
InBlock.gif
returnE_FAIL;
InBlock.gif
InBlock.gif
//设置D3DPRESENT_PARAMETERS结构,准备创建Direct3D设备对象
InBlock.gif
D3DPRESENT_PARAMETERSd3dpp;
InBlock.gifZeroMemory(
&d3dpp,sizeof(d3dpp));
InBlock.gifd3dpp.Windowed
=TRUE;
InBlock.gifd3dpp.SwapEffect
=D3DSWAPEFFECT_DISCARD;
InBlock.gifd3dpp.BackBufferFormat
=D3DFMT_UNKNOWN;
InBlock.gifd3dpp.EnableAutoDepthStencil
=TRUE;
InBlock.gifd3dpp.AutoDepthStencilFormat
=D3DFMT_D16;
InBlock.gif
InBlock.gif
//创建Direct3D设备对象
InBlock.gif
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
InBlock.gifD3DCREATE_SOFTWARE_VERTEXPROCESSING,
InBlock.gif
&d3dpp,&g_pd3dDevice)))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnE_FAIL;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//设置环境光
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);
InBlock.gif
InBlock.gif
//设置雾的颜色
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGCOLOR,0xff0000ff);
InBlock.gif
InBlock.gif
//设置纹理过滤状态
InBlock.gif
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
InBlock.gifg_pd3dDevice
->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
InBlock.gifg_pd3dDevice
->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
InBlock.gifg_pd3dDevice
->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
InBlock.gif
InBlock.gif
returnS_OK;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:从绝对路径中提取纹理文件名
None.gif
// -----------------------------------------------------------------------------
None.gif
void RemovePathFromFileName(LPSTRfullPath,LPWSTRfileName)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//先将fullPath的类型变换为LPWSTR
InBlock.gif
WCHARwszBuf[MAX_PATH];
InBlock.gifMultiByteToWideChar(CP_ACP,
0,fullPath,-1,wszBuf,MAX_PATH);
InBlock.gifwszBuf[MAX_PATH
-1]=L'/0';
InBlock.gif
InBlock.gifWCHAR
*wszFullPath=wszBuf;
InBlock.gif
InBlock.gif
//从绝对路径中提取文件名
InBlock.gif
LPWSTRpch=wcsrchr(wszFullPath,'//');
InBlock.gif
if(pch)
InBlock.giflstrcpy(fileName,
++pch);
InBlock.gif
else
InBlock.giflstrcpy(fileName,wszFullPath);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:创建场景图形
None.gif
// -----------------------------------------------------------------------------
None.gif
HRESULTInitGeometry()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifLPD3DXBUFFERpD3DXMtrlBuffer;
//存储模型材料的缓冲区对象
InBlock.gif
InBlock.gif
//从磁盘文件加载网格模型
InBlock.gif
if(FAILED(D3DXLoadMeshFromX(L"seafloor.x",D3DXMESH_SYSTEMMEM,
InBlock.gifg_pd3dDevice,NULL,
InBlock.gif
&pD3DXMtrlBuffer,NULL,&g_dwNumMaterials,
InBlock.gif
&g_pMesh)))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifMessageBox(NULL,L
"Couldnotfindseafloor.x",L"Fog",MB_OK);
InBlock.gif
returnE_FAIL;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//从网格模型中提取材料属性和纹理文件名
InBlock.gif
D3DXMATERIAL*d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
InBlock.gifg_pMeshMaterials
=newD3DMATERIAL9[g_dwNumMaterials];//材料结构数组
InBlock.gif

InBlock.gif
if(g_pMeshMaterials==NULL)
InBlock.gif
returnE_OUTOFMEMORY;
InBlock.gifg_pMeshTextures
=newLPDIRECT3DTEXTURE9[g_dwNumMaterials];
InBlock.gif
if(g_pMeshTextures==NULL)
InBlock.gif
returnE_OUTOFMEMORY;
InBlock.gif
InBlock.gif
//逐块提取网格模型材料属性和纹理文件名
InBlock.gif
for(DWORDi=0;i<g_dwNumMaterials;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//复制材料属性
InBlock.gif
g_pMeshMaterials[i]=d3dxMaterials[i].MatD3D;
InBlock.gifg_pMeshMaterials[i].Ambient
=g_pMeshMaterials[i].Diffuse;
InBlock.gif
InBlock.gifg_pMeshTextures[i]
=NULL;
InBlock.gif
if(d3dxMaterials[i].pTextureFilename!=NULL&&
InBlock.gifstrlen(d3dxMaterials[i].pTextureFilename)
>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//获取纹理文件名
InBlock.gif
WCHARfilename[256];
InBlock.gifRemovePathFromFileName(d3dxMaterials[i].pTextureFilename,filename);
InBlock.gif
InBlock.gif
//创建纹理
InBlock.gif
if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,filename,
InBlock.gif
&g_pMeshTextures[i])))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifMessageBox(NULL,L
"Couldnotfindtexturemap",L"Fog",MB_OK);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//释放在加载模型文件时创建的保存模型材质和纹理信息的缓冲区对象
InBlock.gif
pD3DXMtrlBuffer->Release();
InBlock.gif
InBlock.gif
//修改网格模型
InBlock.gif
LPDIRECT3DVERTEXBUFFER9pVB;
InBlock.gif
if(SUCCEEDED(g_pMesh->GetVertexBuffer(&pVB)))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
structVERTEXdot.gif{FLOATx,y,z,tu,tv;};
InBlock.gifVERTEX
*pVertices;
InBlock.gifDWORDdwNumVertices
=g_pMesh->GetNumVertices();
InBlock.gif
InBlock.gifpVB
->Lock(0,0,(void**)&pVertices,0);
InBlock.gif
InBlock.gif
for(DWORDi=0;i<dwNumVertices;i++)
InBlock.gifpVertices[i].y
=HeightField(pVertices[i].x,pVertices[i].z);
InBlock.gif
InBlock.gifpVB
->Unlock();
InBlock.gifpVB
->Release();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
returnS_OK;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:释放创建对象
None.gif
// -----------------------------------------------------------------------------
None.gif
VOIDCleanup()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//释放网格模型材料
InBlock.gif
if(g_pMeshMaterials!=NULL)
InBlock.gifdelete[]g_pMeshMaterials;
InBlock.gif
InBlock.gif
//释放网格模型纹理
InBlock.gif
if(g_pMeshTextures)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(DWORDi=0;i<g_dwNumMaterials;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(g_pMeshTextures[i])
InBlock.gifg_pMeshTextures[i]
->Release();
ExpandedSubBlockEnd.gif}

InBlock.gifdelete[]g_pMeshTextures;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//释放网格模型对象
InBlock.gif
if(g_pMesh!=NULL)
InBlock.gifg_pMesh
->Release();
InBlock.gif
InBlock.gif
//释放Direct3D设备对象
InBlock.gif
if(g_pd3dDevice!=NULL)
InBlock.gifg_pd3dDevice
->Release();
InBlock.gif
InBlock.gif
//释放Direct3D对象
InBlock.gif
if(g_pD3D!=NULL)
InBlock.gifg_pD3D
->Release();
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
// -------------------------------------------------
None.gif
// Desc:设置变换矩阵
None.gif
// --------------------------------------------------
None.gif
VOIDSetupMatrices()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//创建并设置世界矩阵
InBlock.gif
D3DXMATRIXA16matWorld;
InBlock.gifD3DXMatrixRotationY(
&matWorld,timeGetTime()/1000.0f);
InBlock.gif
//D3DXMatrixIdentity(&matWorld);
InBlock.gif
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
InBlock.gif
InBlock.gif
//创建并设置观察矩阵
InBlock.gif
D3DXVECTOR3vEyePt(0.0f,30.0f,-100.0f);
InBlock.gifD3DXVECTOR3vLookatPt(
0.0f,0.0f,0.0f);
InBlock.gifD3DXVECTOR3vUpVec(
0.0f,1.0f,0.0f);
InBlock.gifD3DXMATRIXA16matView;
InBlock.gifD3DXMatrixLookAtLH(
&matView,&vEyePt,&vLookatPt,&vUpVec);
InBlock.gifg_pd3dDevice
->SetTransform(D3DTS_VIEW,&matView);
InBlock.gif
InBlock.gif
//创建并设置投影矩阵
InBlock.gif
D3DXMATRIXA16matProj;
InBlock.gifD3DXMatrixPerspectiveFovLH(
&matProj,D3DX_PI/4,1.0f,1.0f,200.0f);
InBlock.gifg_pd3dDevice
->SetTransform(D3DTS_PROJECTION,&matProj);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:渲染图形
None.gif
// -----------------------------------------------------------------------------
None.gif
VOIDRender()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//清空后台缓冲区
InBlock.gif
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
InBlock.gifD3DCOLOR_XRGB(
0,0,255),1.0f,0);
InBlock.gif
InBlock.gif
//开始在后台缓冲区绘制图形
InBlock.gif
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifSetupMatrices();
//设置世界矩阵
InBlock.gif
InBlock.gif
//逐块渲染网格模型
InBlock.gif
for(DWORDi=0;i<g_dwNumMaterials;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//设置材料和纹理
InBlock.gif
g_pd3dDevice->SetMaterial(&g_pMeshMaterials[i]);
InBlock.gifg_pd3dDevice
->SetTexture(0,g_pMeshTextures[i]);
InBlock.gif
InBlock.gif
//渲染模型
InBlock.gif
g_pMesh->DrawSubset(i);
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//结束在后台缓冲区渲染图形
InBlock.gif
g_pd3dDevice->EndScene();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//将在后台缓冲区绘制的图形提交到前台缓冲区显示
InBlock.gif
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:消息处理
None.gif
// -----------------------------------------------------------------------------
None.gif
LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
staticfloatfogStart=50;//线性雾化开始位置
InBlock.gif
staticfloatfogEnd=200;//线性雾化结束位置
InBlock.gif
staticfloatfogDensity=0.01f;//雾的浓度
InBlock.gif

InBlock.gif
switch(msg)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
caseWM_DESTROY:
InBlock.gifCleanup();
InBlock.gifPostQuitMessage(
0);
InBlock.gif
return0;
InBlock.gif
InBlock.gif
caseWM_KEYDOWN:
InBlock.gif
switch(wParam)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case48://"0"键禁用雾化效果
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,false);//禁用雾化
InBlock.gif
break;
InBlock.gif
InBlock.gif
case49://"1"键,线性雾化
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,true);//激活雾化
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);
InBlock.gif
InBlock.gif
//设置线性雾化开始位置和结束位置
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&fogStart);
InBlock.gifg_pd3dDevice
->SetRenderState(D3DRS_FOGEND,*(DWORD*)&fogEnd);
InBlock.gif
break;
InBlock.gif
InBlock.gif
case50://"2"键,指数雾化
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,true);//激活雾化
InBlock.gif
InBlock.gif
//设置雾化混合因子计算公式
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_EXP);
InBlock.gif
InBlock.gif
//设置雾的浓度
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&fogDensity);
InBlock.gif
InBlock.gif
break;
InBlock.gif
InBlock.gif
case51://"3"键,指数平方雾化
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,true);//激活雾化
InBlock.gif
InBlock.gif
//设置雾化混合因子计算公式
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_EXP2);
InBlock.gif
InBlock.gif
//设置雾的浓度
InBlock.gif
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&fogDensity);
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
returnDefWindowProc(hWnd,msg,wParam,lParam);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
// -----------------------------------------------------------------------------
None.gif
// Desc:程序入口
None.gif
// -----------------------------------------------------------------------------
None.gif
INTWINAPIWinMain(HINSTANCEhInst,HINSTANCE,LPSTR,INT)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//注册窗口类
ExpandedSubBlockStart.gifContractedSubBlock.gif
WNDCLASSEXwc=dot.gif{sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
InBlock.gifGetModuleHandle(NULL),NULL,NULL,NULL,NULL,
ExpandedSubBlockEnd.gifL
"ClassName",NULL}
;
InBlock.gifRegisterClassEx(
&wc);
InBlock.gif
InBlock.gif
//创建窗口
InBlock.gif
HWNDhWnd=CreateWindow(L"ClassName",L"顶点雾化",
InBlock.gifWS_OVERLAPPEDWINDOW,
200,100,600,500,
InBlock.gifGetDesktopWindow(),NULL,wc.hInstance,NULL);
InBlock.gif
InBlock.gif
//初始化Direct3D
InBlock.gif
if(SUCCEEDED(InitD3D(hWnd)))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//创建场景图形
InBlock.gif
if(SUCCEEDED(InitGeometry()))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//显示窗口
InBlock.gif
ShowWindow(hWnd,SW_SHOWDEFAULT);
InBlock.gifUpdateWindow(hWnd);
InBlock.gif
InBlock.gif
//进入消息循环
InBlock.gif
MSGmsg;
InBlock.gifZeroMemory(
&msg,sizeof(msg));
InBlock.gif
while(msg.message!=WM_QUIT)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifTranslateMessage(
&msg);
InBlock.gifDispatchMessage(
&msg);
ExpandedSubBlockEnd.gif}

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifRender();
//渲染图形
ExpandedSubBlockEnd.gif
}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gifUnregisterClass(L
"ClassName",wc.hInstance);
InBlock.gif
return0;
ExpandedBlockEnd.gif}

None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值