首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

关于骨架动画的网格容器疑惑

2013-04-21 
关于骨骼动画的网格容器疑惑 //提取纹理文件, 创建纹理对象for (iMaterial 0 iMaterial NumMaterials

关于骨骼动画的网格容器疑惑


 //提取纹理文件, 创建纹理对象
for (iMaterial = 0; iMaterial < NumMaterials; iMaterial++) 
        {
            if (pMeshContainer->pMaterials[iMaterial].pTextureFilename != NULL)
            {
WCHAR strTexturePath[MAX_PATH];
                WCHAR wszBuf[MAX_PATH];
//从纹理文件路径提取纹理文件名
RemovePathFromFileName(pMeshContainer->pMaterials[iMaterial].pTextureFilename, wszBuf);
                //根据纹理文件名从事先指定的路径查找纹理文件
DXUTFindDXSDKMediaFileCch( strTexturePath, MAX_PATH, wszBuf );
                if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexturePath,
                                                        &pMeshContainer->ppTextures[iMaterial] ) ) )
//此处之所以要将ppTexture指向的纹理数组指针放弃掉?
                    pMeshContainer->ppTextures[iMaterial] = NULL;

//同样此处为什么要放弃?!!
                pMeshContainer->pMaterials[iMaterial].pTextureFilename = NULL;
}
        }
如代码中所示,为什么在加载纹理成功后要将返回的纹理接口指针给放弃掉?
*ppNewMeshContainer = pMeshContainer;

该函数将已经放弃掉的网格容器给返回,并在LoadFromXFile函数中隐式的由D3D调用,最后在DrawContainer代码中进行如下绘制:

for (iMaterial = 0; iMaterial < pMeshContainer->NumMaterials; iMaterial++)
{
m_pd3dDevice->SetMaterial( &pMeshContainer->pMaterials[iMaterial].MatD3D );
m_pd3dDevice->SetTexture( 0, pMeshContainer->ppTextures[iMaterial] );
pMeshContainer->MeshData.pMesh->DrawSubset(iMaterial);
}
请问这时候ppTextures[iMaterial]肯定已经是NULL了,那么为什么还能成功的由它来设置纹理呢?
求高人指点,拜谢!!!
[解决办法]
                if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexturePath,                                                        &pMeshContainer->ppTextures[iMaterial] ) ) )                    //此处之所以要将ppTexture指向的纹理数组指针放弃掉?                    pMeshContainer->ppTextures[iMaterial] = NULL;

注意看这一段,当纹理加载失败时,才会让它=NULL, 如果加载成功,则不会执行这个的。

另外。
//同样此处为什么要放弃?!!             


   pMeshContainer->pMaterials[iMaterial].pTextureFilename = NULL;
这个是放掉纹理字符串, 因为纹理处理以后,这个字符串就没作用了。自然要放掉。

热点排行