关于D3D龙书第二版里面网格顶点越界的有关问题

关于D3D龙书第二版里面网格顶点越界的问题
D3D龙书第二版中,有一个关于用广告牌实现草堆的问题,我自己写了一下,会发现网格中的顶点数够,但是却会内存越界的问题:

VerGrass* vertices;
WORD*   indices;
//读取数据
hr=mGrass->LockVertexBuffer(0, (void**)&vertices);
hr=mGrass->LockIndexBuffer(0, (void**)&indices);
//mDenstity密集度就是说草堆中有多少个“广告牌”,一个“广告牌”拥有两个三角形
//四个顶点,六个索引
float x, y, z, a;
D3DXCOLOR c;
D3DXVECTOR3 center;
WORD OFFSET=0;
int ii=0;
for (UINT i = 0; i < mDensity; ++i)
{

//根据半径和草堆中心填充数据
x = mCenter.x + MQ::RandomFloat(-mRadius, mRadius);
z = mCenter.z + MQ::RandomFloat(-mRadius, mRadius);
y = mTerrain->GetHeight(x, z);

D3DXVECTOR3  center = D3DXVECTOR3(x, y, z);


c = D3DXCOLOR(MQ::RandomFloat(0.0f, 0.1f), MQ::RandomFloat(0.1f, 0.2f), MQ::RandomFloat(0.0f, 0.1f),0.0F);
a = MQ::RandomFloat(1.0f, 1.5f);

vertices[0] = VerGrass(D3DXVECTOR3(-1.0f, -0.5f, 0.0f), D3DXVECTOR2(0.0f, 1.0f), 0.0f, c);
vertices[1] = VerGrass(D3DXVECTOR3(-1.0f, 0.5f, 0.0f), D3DXVECTOR2(0.0f, 0.0f), a, c);
vertices[2] = VerGrass(D3DXVECTOR3(1.0f, 0.5f, 0.0f), D3DXVECTOR2(1.0f, 0.0f), a, c);
vertices[3] = VerGrass(D3DXVECTOR3(1.0f, -0.5f, 0.0f), D3DXVECTOR2(1.0f, 1.0f), 0.0f, c);

/*indices[0] = 0 + OFFSET;
indices[1] = 1 + OFFSET;
indices[2] = 2 + OFFSET;
indices[3] = 0 + OFFSET;
indices[4] = 2 + OFFSET;
indices[5] = 3 + OFFSET;*/

/*//修改高度
center.y += (vertices[1].posL.y - vertices[0].posL.y)*0.5f;

vertices[0].center = center; 
vertices[1].center = center;
vertices[2].center = center;
vertices[3].center = center;*/

//顶点跳4,索引跳6
vertices += 4;
indices += 6;
OFFSET += 4;


}

在这当中,我输入的mDensity是300,网格顶点数是1200,但是循环这个循环会出错,当我把vertices+=4这句话屏蔽了,就正常了,但是当我 测试vertices[1196]写入数据的时候,还是错的,说明顶点缓存中顶点数据没有1200个,这让我很奇怪。。明明显示的是1200个顶点(GetNumVertices()得到的顶点数也是1200)
下面是顶点声明:
struct VerGrass
{
D3DXVECTOR3 posL;//顶点局部坐标
D3DXVECTOR3 center;//广告牌中心
D3DXVECTOR2     texcoord;//纹理坐标
float amplitude;//振幅
D3DXCOLOR offsetColor;//偏移颜色

VerGrass() :posL(0.0f, 0.0f, 0.0f), center(0.0f, 0.0f, 0.0f),
texcoord(0.0f, 0.0f), amplitude(0), offsetColor(D3DXCOLOR(0, 0, 0, 0)){}
VerGrass(D3DXVECTOR3 Pos, D3DXVECTOR2 Tex, float a, D3DXCOLOR offset) :
posL(Pos), texcoord(Tex), amplitude(a), offsetColor(offset){}

static IDirect3DVertexDeclaration9* Decl;
};

D3DVERTEXELEMENT9 elems[] =
{

{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },
{ 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2 },
{ 0, 36, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
D3DDECL_END()

};
HRESULT hr =mDevice->CreateVertexDeclaration(elems, &VerGrass::Decl);


查了好久,都找不到错误。。希望有哪位大神能够帮忙看下



------解决方案--------------------
这年头,都很难看到D3D的贴子了!关于D3D龙书第二版里面网格顶点越界的有关问题
恭喜楼主很快解决问题!关于D3D龙书第二版里面网格顶点越界的有关问题
------解决方案--------------------
D3DXCOLOR类从D3DCOLOR结构体继承下来的,使用起来更方便一些,但是sizeof就没有试过。