|
只有个白色的透明的 物品 纹理无法贴上去 [em17] [em17] [em17] [em17] [em17] [em17] [em17]

//加载x文件的核心函数(D3D::Mesh网* p的网格, x文件的文件名)
int d3d::InitMesh(d3d::Mesh* pMesh, LPCTSTR xfilename)
{
pMesh->pMaterialVector = new std::vector<D3DMATERIAL9>; // 模型的材质容器(一个模型可以有多个材质)
pMesh->pTexVector = new std::vector<IDirect3DTexture9*>;// 模型的纹理容器(一个模型可以有多个纹理)
ID3DXBuffer* adjBuffer = NULL;//缓冲区// 材质缓冲
ID3DXBuffer* mtrlBuffer = NULL;//缓冲区
DWORD numMtrls = 0;// 材质的数量(等于纹理数量)//DWORD 现在表示 32bit 无符号整数
// D3DXLoadMeshFromX载入.x文件
HRESULT hr = D3DXLoadMeshFromX(
xfilename,// [输入].x文件名
D3DXMESH_MANAGED,/*创建Mesh的标志不含动画的普通X文件,有一个Mesh单元,
保存了各顶点信息、各三角面的索引信息、材质种类及定义等*/
s_pDevice,// [输入]d3d设备指针
&adjBuffer,//使用ID3DXBuffer返回Mesh的邻接信息,这是一个DWORD数组
&mtrlBuffer,//使用ID3DXBuffer返回Mesh的材质数据,这是一个D3DXMATERIAL类型数组
0,// [输出]获取模型的材质缓冲
&numMtrls,//// [输出]材质的数量
&pMesh->pMesh//返回ID3DXMesh对象[输出]模型对象指针
);
if (FAILED(hr))
{
debug::MessageBox("读取.X文件失败!");
return 0;
}
//如果(mtrl缓冲区!= NULL &&返回Mesh对象的材质数量!= 0)
if (mtrlBuffer != NULL && numMtrls != 0)//numMtrls,返回Mesh对象的材质数量
{
D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();// 获取材质指针
for (int i=0; i<numMtrls; ++i)//返回Mesh对象的材质数量
{ // 把需要的材质拷贝到我们的材质对象中
mtrls.MatD3D.Ambient = mtrls.MatD3D.Diffuse;
//p网格-> P材料载体->//push_back在字符串之后插入一个字符
pMesh->pMaterialVector->push_back(mtrls.MatD3D);
//if(mtrls.p纹理文件名 != NULL)
if(mtrls.pTextureFilename != NULL)
{
IDirect3DTexture9* pTex = NULL;//IDirect3D纹理9* pTex = NULL;
D3DXCreateTextureFromFile//D3DX从X文件创建对应纹理
(
s_pDevice,//设备
mtrls.pTextureFilename,//p纹理文件名
&pTex// 指向一个纹理地址的指针
);
pMesh->pTexVector->push_back(pTex);//纹理对象//push_back在字符串之后插入一个字符
}
else
{
pMesh->pTexVector->push_back(NULL);
}
}
SAFE_RELEASE(mtrlBuffer);
}
return 1;
}
//清除网格(D3D::网* p的网格)
int d3d::ClearMesh(d3d::Mesh* pMesh)
{
for (int i=0; i<pMesh->pTexVector->size(); ++i)
{
SAFE_RELEASE(pMesh->pTexVector->at(i));
}
SAFE_DELETE(pMesh->pTexVector);
SAFE_DELETE(pMesh->pMaterialVector);
SAFE_RELEASE(pMesh->pMesh);
return 1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//下面是两个不同的渲染函数程序中都有应用
////////////////////////////////////////////////////////////////////////////////////////////////////
int d3d::RenderMesh(d3d::Mesh* pMesh)
{
for ( int i=0; i < pMesh->pMaterialVector->size(); ++i )
{ // 为这一部分设置材质
//d3d设备指针->设定材质( 材质对象数组 )
s_pDevice->SetMaterial( &pMesh->pMaterialVector->at(i) );
//d3d设备指针->设定纹理(0,模型的纹理数组)
s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
// 渲染这一部分
pMesh->pMesh->DrawSubset(i);
}
return 1;
}
int d3d::RenderTeamMesh(d3d::Mesh* pMesh, D3DMATERIAL9* pMaterial, int iPart)
{// 根据材质的数量我们的模型被切分了,每个材质对应一部分
// 所以渲染的时候也要分几个部分渲染
for ( int i=0; i < iPart; ++i )
{ //d3d设备指针->设定材质( 材质对象数组 )
s_pDevice->SetMaterial( &pMesh->pMaterialVector->at(i) );
//d3d设备指针->设定纹理(0,模型的纹理数组)
s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
// 渲染这一部分
pMesh->pMesh->DrawSubset(i);
}
// 为这一部分设置材质
//d3d设备指针->设定材质( 材质对象数组 )
s_pDevice->SetMaterial( pMaterial );//设置素材(材质容器)
//d3d设备指针->设定纹理(0,模型的纹理数组)
s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
// 渲染这一部分
pMesh->pMesh->DrawSubset(iPart);
for (i=iPart+1; i < pMesh->pMaterialVector->size(); ++i )
{// 为这一部分设置材质
s_pDevice->SetMaterial( &pMesh->pMaterialVector->at(i) );
s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
// 渲染这一部分
pMesh->pMesh->DrawSubset(i);
}
return 1;
}
|
|