`
phinecos
  • 浏览: 342884 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DirectX示例--顶点雾化

 
阅读更多
2008061301.jpg

//=============================================================================
//Desc:顶点雾化效果
//=============================================================================
#include<d3dx9.h>


//-----------------------------------------------------------------------------
//全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9g_pD3D=NULL;//Direct3D对象
LPDIRECT3DDEVICE9g_pd3dDevice=NULL;//Direct3D设备对象

LPD3DXMESHg_pMesh
=NULL;//网格模型对象
D3DMATERIAL9*g_pMeshMaterials=NULL;//网格模型材料
LPDIRECT3DTEXTURE9*g_pMeshTextures=NULL;//网格模型纹理
DWORDg_dwNumMaterials=0L;//网格模型子块数量


//----------------------------------------------------------------------------
//Desc:
//----------------------------------------------------------------------------
inlineFLOATHeightField(FLOATx,FLOATz)
{
FLOATy
=0.0f;
y
+=10.0f*cosf(0.051f*x+0.0f)*sinf(0.055f*x+0.0f);
y
+=10.0f*cosf(0.053f*z+0.0f)*sinf(0.057f*z+0.0f);
y
+=2.0f*cosf(0.101f*x+0.0f)*sinf(0.105f*x+0.0f);
y
+=2.0f*cosf(0.103f*z+0.0f)*sinf(0.107f*z+0.0f);
y
+=2.0f*cosf(0.251f*x+0.0f)*sinf(0.255f*x+0.0f);
y
+=2.0f*cosf(0.253f*z+0.0f)*sinf(0.257f*z+0.0f);
returny;
}



//-----------------------------------------------------------------------------
//Desc:初始化Direct3D
//-----------------------------------------------------------------------------
HRESULTInitD3D(HWNDhWnd)
{
//创建Direct3D对象,该对象用来创建Direct3D设备对象
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
returnE_FAIL;

//设置D3DPRESENT_PARAMETERS结构,准备创建Direct3D设备对象
D3DPRESENT_PARAMETERSd3dpp;
ZeroMemory(
&d3dpp,sizeof(d3dpp));
d3dpp.Windowed
=TRUE;
d3dpp.SwapEffect
=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat
=D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil
=TRUE;
d3dpp.AutoDepthStencilFormat
=D3DFMT_D16;

//创建Direct3D设备对象
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pd3dDevice)))
{
returnE_FAIL;
}


//设置环境光
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);

//设置雾的颜色
g_pd3dDevice->SetRenderState(D3DRS_FOGCOLOR,0xff0000ff);

//设置纹理过滤状态
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
g_pd3dDevice
->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
g_pd3dDevice
->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
g_pd3dDevice
->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);

returnS_OK;
}



//-----------------------------------------------------------------------------
//Desc:从绝对路径中提取纹理文件名
//-----------------------------------------------------------------------------
voidRemovePathFromFileName(LPSTRfullPath,LPWSTRfileName)
{
//先将fullPath的类型变换为LPWSTR
WCHARwszBuf[MAX_PATH];
MultiByteToWideChar(CP_ACP,
0,fullPath,-1,wszBuf,MAX_PATH);
wszBuf[MAX_PATH
-1]=L'/0';

WCHAR
*wszFullPath=wszBuf;

//从绝对路径中提取文件名
LPWSTRpch=wcsrchr(wszFullPath,'//');
if(pch)
lstrcpy(fileName,
++pch);
else
lstrcpy(fileName,wszFullPath);
}



//-----------------------------------------------------------------------------
//Desc:创建场景图形
//-----------------------------------------------------------------------------
HRESULTInitGeometry()
{
LPD3DXBUFFERpD3DXMtrlBuffer;
//存储模型材料的缓冲区对象

//从磁盘文件加载网格模型
if(FAILED(D3DXLoadMeshFromX(L"seafloor.x",D3DXMESH_SYSTEMMEM,
g_pd3dDevice,NULL,
&pD3DXMtrlBuffer,NULL,&g_dwNumMaterials,
&g_pMesh)))
{
MessageBox(NULL,L
"Couldnotfindseafloor.x",L"Fog",MB_OK);
returnE_FAIL;
}


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

if(g_pMeshMaterials==NULL)
returnE_OUTOFMEMORY;
g_pMeshTextures
=newLPDIRECT3DTEXTURE9[g_dwNumMaterials];
if(g_pMeshTextures==NULL)
returnE_OUTOFMEMORY;

//逐块提取网格模型材料属性和纹理文件名
for(DWORDi=0;i<g_dwNumMaterials;i++)
{
//复制材料属性
g_pMeshMaterials[i]=d3dxMaterials[i].MatD3D;
g_pMeshMaterials[i].Ambient
=g_pMeshMaterials[i].Diffuse;

g_pMeshTextures[i]
=NULL;
if(d3dxMaterials[i].pTextureFilename!=NULL&&
strlen(d3dxMaterials[i].pTextureFilename)
>0)
{
//获取纹理文件名
WCHARfilename[256];
RemovePathFromFileName(d3dxMaterials[i].pTextureFilename,filename);

//创建纹理
if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,filename,
&g_pMeshTextures[i])))
{
MessageBox(NULL,L
"Couldnotfindtexturemap",L"Fog",MB_OK);
}

}

}


//释放在加载模型文件时创建的保存模型材质和纹理信息的缓冲区对象
pD3DXMtrlBuffer->Release();

//修改网格模型
LPDIRECT3DVERTEXBUFFER9pVB;
if(SUCCEEDED(g_pMesh->GetVertexBuffer(&pVB)))
{
structVERTEX{FLOATx,y,z,tu,tv;};
VERTEX
*pVertices;
DWORDdwNumVertices
=g_pMesh->GetNumVertices();

pVB
->Lock(0,0,(void**)&pVertices,0);

for(DWORDi=0;i<dwNumVertices;i++)
pVertices[i].y
=HeightField(pVertices[i].x,pVertices[i].z);

pVB
->Unlock();
pVB
->Release();
}


returnS_OK;
}



//-----------------------------------------------------------------------------
//Desc:释放创建对象
//-----------------------------------------------------------------------------
VOIDCleanup()
{
//释放网格模型材料
if(g_pMeshMaterials!=NULL)
delete[]g_pMeshMaterials;

//释放网格模型纹理
if(g_pMeshTextures)
{
for(DWORDi=0;i<g_dwNumMaterials;i++)
{
if(g_pMeshTextures[i])
g_pMeshTextures[i]
->Release();
}

delete[]g_pMeshTextures;
}


//释放网格模型对象
if(g_pMesh!=NULL)
g_pMesh
->Release();

//释放Direct3D设备对象
if(g_pd3dDevice!=NULL)
g_pd3dDevice
->Release();

//释放Direct3D对象
if(g_pD3D!=NULL)
g_pD3D
->Release();
}




//-------------------------------------------------
//Desc:设置变换矩阵
//--------------------------------------------------
VOIDSetupMatrices()
{
//创建并设置世界矩阵
D3DXMATRIXA16matWorld;
D3DXMatrixRotationY(
&matWorld,timeGetTime()/1000.0f);
//D3DXMatrixIdentity(&matWorld);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

//创建并设置观察矩阵
D3DXVECTOR3vEyePt(0.0f,30.0f,-100.0f);
D3DXVECTOR3vLookatPt(
0.0f,0.0f,0.0f);
D3DXVECTOR3vUpVec(
0.0f,1.0f,0.0f);
D3DXMATRIXA16matView;
D3DXMatrixLookAtLH(
&matView,&vEyePt,&vLookatPt,&vUpVec);
g_pd3dDevice
->SetTransform(D3DTS_VIEW,&matView);

//创建并设置投影矩阵
D3DXMATRIXA16matProj;
D3DXMatrixPerspectiveFovLH(
&matProj,D3DX_PI/4,1.0f,1.0f,200.0f);
g_pd3dDevice
->SetTransform(D3DTS_PROJECTION,&matProj);
}





//-----------------------------------------------------------------------------
//Desc:渲染图形
//-----------------------------------------------------------------------------
VOIDRender()
{
//清空后台缓冲区
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(
0,0,255),1.0f,0);

//开始在后台缓冲区绘制图形
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupMatrices();
//设置世界矩阵

//逐块渲染网格模型
for(DWORDi=0;i<g_dwNumMaterials;i++)
{
//设置材料和纹理
g_pd3dDevice->SetMaterial(&g_pMeshMaterials[i]);
g_pd3dDevice
->SetTexture(0,g_pMeshTextures[i]);

//渲染模型
g_pMesh->DrawSubset(i);
}


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


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



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

switch(msg)
{
caseWM_DESTROY:
Cleanup();
PostQuitMessage(
0);
return0;

caseWM_KEYDOWN:
switch(wParam)
{
case48://"0"键禁用雾化效果
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,false);//禁用雾化
break;

case49://"1"键,线性雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,true);//激活雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);

//设置线性雾化开始位置和结束位置
g_pd3dDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&fogStart);
g_pd3dDevice
->SetRenderState(D3DRS_FOGEND,*(DWORD*)&fogEnd);
break;

case50://"2"键,指数雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,true);//激活雾化

//设置雾化混合因子计算公式
g_pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_EXP);

//设置雾的浓度
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&fogDensity);

break;

case51://"3"键,指数平方雾化
g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE,true);//激活雾化

//设置雾化混合因子计算公式
g_pd3dDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_EXP2);

//设置雾的浓度
g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&fogDensity);
break;
}

}


returnDefWindowProc(hWnd,msg,wParam,lParam);
}



//-----------------------------------------------------------------------------
//Desc:程序入口
//-----------------------------------------------------------------------------
INTWINAPIWinMain(HINSTANCEhInst,HINSTANCE,LPSTR,INT)
{
//注册窗口类
WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
L
"ClassName",NULL}
;
RegisterClassEx(
&wc);

//创建窗口
HWNDhWnd=CreateWindow(L"ClassName",L"顶点雾化",
WS_OVERLAPPEDWINDOW,
200,100,600,500,
GetDesktopWindow(),NULL,wc.hInstance,NULL);

//初始化Direct3D
if(SUCCEEDED(InitD3D(hWnd)))
{
//创建场景图形
if(SUCCEEDED(InitGeometry()))
{
//显示窗口
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);

//进入消息循环
MSGmsg;
ZeroMemory(
&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(
&msg);
DispatchMessage(
&msg);
}

else
{
Render();
//渲染图形
}

}

}

}


UnregisterClass(L
"ClassName",wc.hInstance);
return0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics