|
|

楼主 |
发表于 2009-3-17 13:19:00
|
显示全部楼层
Re:关与D3D中纹理混合的问题
HRESULT CTerrain::InitTerrain(DWORD _cols)
{
g_pCols = _cols;
g_pNumFace = g_pCols * g_pCols * 2;
g_pNumVertex = (g_pCols + 1) * (g_pCols + 1);
g_pHeight = new BYTE[g_pNumVertex];
DWORD numRow = g_pCols + 1;//每行的顶点数
for (DWORD row = 0; row < g_pCols + 1; ++row)
{
for (DWORD col = 0; col < g_pCols + 1;++col)
{
DWORD index = row * numRow + col;
g_pHeight[index] = 0;
}
}
g_pAttri = new BYTE[g_pNumFace];
for(DWORD num = 0; num < g_pNumFace;++num)
{
g_pAttri[num] = 0;
}
LPDIRECT3DTEXTURE9 pTempTex;
D3DXCreateTextureFromFile(g_pd3dDevice,L"草1.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"草2.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"草3.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"地1.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"地2.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"地3.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"石路1.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
D3DXCreateTextureFromFile(g_pd3dDevice,L"石路2.bmp",&pTempTex);
g_pTexture.push_back(pTempTex);
HRESULT hr;
hr = D3DXCreateMeshFVF(g_pNumFace,g_pNumVertex,D3DXMESH_MANAGED,VERTEX::FVF,g_pd3dDevice,&g_pMesh);
InitVB(g_pCols);
InitIB(g_pCols);
InitAB();
return S_OK;
}
//顶点缓冲
void CTerrain::InitVB(
DWORD _cols)
{
g_pCols = _cols;
float lengthX = g_pCols * g_pTileSize;//X方向上总长度
float lengthZ = g_pCols * g_pTileSize;//Z方向上总长度
DWORD numRow = g_pCols + 1;//每行的顶点数
VERTEX* v = NULL;
g_pMesh->LockVertexBuffer(0,(void**)&v);
for (DWORD row = 0; row < g_pCols + 1; ++row)
{
for (DWORD col = 0; col < g_pCols + 1;++col)
{
DWORD index = row * numRow + col;
//设置顶点坐标
v[index].x = -lengthX * 0.5f + g_pTileSize * col;
v[index].y = (float)g_pHeight[index];
v[index].z = lengthZ * 0.5f - g_pTileSize * row;
//设置顶点UV
if ((row % 2) == 0)
{
if ((col % 2) == 0)
{
v[index].tu = 0.0f;
v[index].tv = 0.0f;
}
else
{
v[index].tu = 1.0f;
v[index].tv = 0.0f;
}
}
else
{
if ((col % 2) == 0)
{
v[index].tu = 0.0f;
v[index].tv = 1.0f;
}
else
{
v[index].tu = 1.0f;
v[index].tv = 1.0f;
}
}
}
}
g_pMesh->UnlockVertexBuffer();
}
//索引缓冲
void CTerrain::InitIB(DWORD _cols)
{
g_pCols = _cols;
DWORD numRow = g_pCols + 1;//每行的顶点数
WORD* i = NULL;
g_pMesh->LockIndexBuffer(0,(void**)&i);
for (DWORD row = 0; row < g_pCols; ++row)
{
for (DWORD col = 0; col < g_pCols;++col )
{
DWORD index = row * g_pCols + col;//每个格子的索引
i[index * 6 + 0] = (WORD)(row * numRow + col);
i[index * 6 + 1] = (WORD)(row * numRow + col + numRow + 1);
i[index * 6 + 2] = (WORD)(row * numRow + col + numRow);
i[index * 6 + 3] = (WORD)(row * numRow + col);
i[index * 6 + 4] = (WORD)(row * numRow + col + 1);
i[index * 6 + 5] = (WORD)(row * numRow + col + numRow + 1);
}
}
g_pMesh->UnlockIndexBuffer();
}
//属性缓冲
void CTerrain::InitAB()
{
DWORD * attribute = NULL;
g_pMesh->LockAttributeBuffer(0,&attribute);
for (DWORD num = 0; num < g_pNumFace;++num)
{
attribute[num] = g_pAttri[num];
}
g_pMesh->UnlockAttributeBuffer();
}
void CTerrain:: Render()
{
//g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
for (DWORD i = 0;i< g_pNumSubset;++i)
{
g_pd3dDevice->SetTexture(0,g_pTexture);
g_pMesh->DrawSubset(i);
}
}
这是我的mesh地形,我鼠标点到哪哪个面就改变它的纹理,等于是相邻的两个面上都只有一层纹理,我就是想这两个面之间的纹理进行一下混合过度,如果在他们之间添加了一个新面那整个地形不就改变了吗
具体的实现方法能不能给出来啊 |
|