|
|
我在做一个地形生成的程序,用一个结构体生成一些地形数据,然后中途改变其数据,使生成的地形也发生改变
我用map创建了一个数据 map<int , psFaceGrain> mFaceGrain; psFaceGrain为自己定义的结构
然后为它赋值,然后把它生成风格模型,最后再绘制这个模型。代码在下面
问题是这样的,当一切准备好后,已经在运行渲染都没有问题。这个时候,我把psFaceGrain的值改变
mFaceGrain[ikeys].TexIndiecs = 1;(原始值为 0)
getQuantree();
再重新生成绘制模型。这个时候,运行的速度会变慢,
如果我把前面的 mFaceGrain[ikeys].TexIndiecs = 1; 注释掉,运行。它的速度是不会变慢的,只是加上它之后。
每运行一次改变一个键的值,就更慢一些。
我创建了一个这样的数据
- struct psFaceGrain
- {
- int TexIndiecs;//纹理序号
- TERRAINVERTEX vVertexs[9];//顶点结构体集合
- };
- map<int , psFaceGrain> mFaceGrain;
复制代码
我会在开始的时候 把mFaceGrain的值都赋上,然后调用下面的代码进行生成网格模型
- //获取树信息,创建顶点 以及索引 缓冲区
- HRESULT Terrain::getQuantree()
- {
- HRESULT hr = 0;
- if (tmesh != NULL)
- {
- tmesh->Release();
- }
- hr = D3DXCreateMeshFVF(
- iIndexs/3,
- iVertex,
- D3DXMESH_MANAGED,
- D3DFVF_TERRAINVERTEX,
- Device,
- &tmesh);
- if(FAILED(hr))
- {
- ::MessageBox(0, "D3DXCreateMeshFVF() - FAILED", 0, 0);
- return S_FALSE;
- }
- int iV = 0;
- int iI = 0;
- TERRAINVERTEX* vertex;
- WORD* idecis;//65535
- DWORD* attributeBuffer = 0;
- for (int iface = 0;iface < (Twidth/2)*(Theight/2);iface++)
- {
- int iIcon = iface*9;
- psFaceGrain pface = mFaceGrain[iface];
- int iTexFace = pface.TexIndiecs;
- tmesh->LockVertexBuffer(iTexFace,(void**)&vertex);
- tmesh->LockIndexBuffer(iTexFace,(void**)&idecis);
- tmesh->LockAttributeBuffer(iTexFace, &attributeBuffer);
- vertex[iV+0] = pface.vVertexs[0];
- vertex[iV+1] = pface.vVertexs[1];
- vertex[iV+2] = pface.vVertexs[2];
- vertex[iV+8] = pface.vVertexs[3];
- vertex[iV+3] = pface.vVertexs[4];
- vertex[iV+4] = pface.vVertexs[5];
- vertex[iV+7] = pface.vVertexs[6];
- vertex[iV+6] = pface.vVertexs[7];
- vertex[iV+5] = pface.vVertexs[8];
- iV+= 9;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 1+iIcon; idecis[iI++] = 2+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 2+iIcon; idecis[iI++] = 3+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 3+iIcon; idecis[iI++] = 4+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 4+iIcon; idecis[iI++] = 5+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 5+iIcon; idecis[iI++] = 6+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 6+iIcon; idecis[iI++] = 7+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 7+iIcon; idecis[iI++] = 8+iIcon;
- idecis[iI++] = 0+iIcon; idecis[iI++] = 8+iIcon; idecis[iI++] = 1+iIcon;
- for (int i =0;i<8;i++)
- {
- attributeBuffer[i+(iI/3-8)] = (DWORD)iTexFace;
- }
- tmesh->UnlockVertexBuffer();
- tmesh->UnlockIndexBuffer();
- tmesh->UnlockAttributeBuffer();
- }
- return S_OK;
- }
复制代码
最后进行渲染
- void Terrain::DrawTerrain()
- {
- //为效果设置组合变换矩阵
- g_pEffect->SetMatrix( "matWorldViewProj", &matWorld );
- //使用效果渲染场景
- D3DXHANDLE hTechnique = g_pEffect->GetTechniqueByName( "TShader" );
- g_pEffect->SetTechnique( hTechnique );
- UINT nPasses;
- g_pEffect->Begin( &nPasses, 0 );
- for (int i = 0;i<2;i++)
- {
- for( UINT iPass = 0; iPass < nPasses; iPass ++ )
- {
- g_pEffect->BeginPass( iPass );
- g_pEffect->SetTexture("TextureMapping", g_pTex[i]);
- getMesh()->DrawSubset(i);
- g_pEffect->EndPass();
- }
- }
- g_pEffect->End();
- }
复制代码
[em6]请各位大侠帮忙看看~~ |
|