- 2
- 0
- 约 14页
- 2017-01-03 发布于贵州
- 举报
第12讲 简易地形构建
原理详见ppt
1、TerrainSample.h
#pragma once
#include d3d9.h
#include d3dx9.h
struct CUSTOMVERTEX3
{
D3DXVECTOR3 pos;
D3DXVECTOR3 nor;
D3DXVECTOR2 tex;
};
#define D3DFVF_CUSTOMVERTEX3 (D3DFVF_XYZ | D3DFVF_NORMAL|D3DFVF_TEX1)
class CTerrainSample
{
public:
CTerrainSample(LPDIRECT3DDEVICE9 device);
~CTerrainSample(void);
bool Init(int, int, float);
bool LoadTerrain(wchar_t *pTextureFile);
void Render();
//根据顶点的x值和z值,计算出y值
float getHeight(float x, float z)const;
private:
//顶点缓冲和顶点索引缓冲/
int m_vertexCount;
int m_indexCount;
LPDIRECT3DDEVICE9 m_pd3dDevice;
LPDIRECT3DTEXTURE9 m_pTexture;
LPDIRECT3DVERTEXBUFFER9 m_pVB;
LPDIRECT3DINDEXBUFFER9 m_pIB;
};
2、TerrainSample.cpp
#include TerrainSample.h
CTerrainSample::CTerrainSample(LPDIRECT3DDEVICE9 device)
{
m_pVB = NULL;
m_pIB = NULL;
m_pd3dDevice=device;
}
CTerrainSample::~CTerrainSample(void)
{
}
float CTerrainSample::getHeight(float x, float z) const
{
return 0;// 4*sin(x);//0.3f*( z*sinf(0.1f*z) + x*cosf(0.1f*x) );
}
bool CTerrainSample::LoadTerrain(wchar_t *pTextureFile)
{
// 加载天空纹理
if (FAILED(D3DXCreateTextureFromFile(m_pd3dDevice, pTextureFile, m_pTexture)))
return FALSE;
return TRUE;
}
bool CTerrainSample::Init( int m, int n, float dx)
{
CUSTOMVERTEX3 * vertices;
WORD * indices;
m_vertexCount = m*n;//计算得到顶点和索引顶点数目
m_indexCount = (m-1)*(n-1)*2*3;//首先得到三角形的数目,然后乘以就是顶点索引数目
//创顶点缓冲区
if( FAILED( m_pd3dDevice-CreateVertexBuffer( m_vertexCount*sizeof(CUSTOMVERTEX3),
0, D3DFVF_CUSTOMVERTEX3,
D3DPOOL_DEFAULT, m_pVB, NULL ) ) )
{
return false;
}
//填充顶点缓冲区
if( FAILED( m_pVB-Lock( 0, 0, (void**)vertices, 0 ) ) )
return false;
float halfWidth = (n-1)*dx*0.5f;
float halfDepth = (m-1)*dx*0.5f;
for(int i = 0; i m; ++i)
{
float z = halfDepth - i*dx;
for(int j = 0; j n; ++j)
{
原创力文档

文档评论(0)