由前面知道,有几个模型不能显示纹理图,纹理文件名称被人改掉了,差不多都是TGA文件。哪人为什么要改呢?可能是CLoad3DS::BuildTexture不支持这些TGA。现在来解决这个问题。
在博文《【OpenGL】游戏编程常用TGA图像格式详解以及加载纹理编程实现》中有 TGATexture.h 和 TGATexture.cpp 可以显示TGA文件,拿来测试下:
这个"中景树.tga"可显示,有些也是不能显示的,只能相互配合着用了。
简单修改一下,方便使用
在TGATexture.cpp增加一个函数:
bool LoadTGATexture(char *szPathName, GLuint &texid) // 装截TGA纹理
{
TextureImage texture[1];
bool b=LoadTGA(&texture[0],szPathName);//调用原来的
texid=texture[0].texID;
return b;
}
在 CLoad3DS::ReadObjectMaterial 中的 BuildTexture 处 加上:
int tmp=BuildTexture(pModel->pMaterials[i].strFile, pModel->texture[pObject->materialID]);
if( tmp==true){
// 设置对象的纹理映射标志
pObject->bHasTexture = true;
}
else{//如果没有成功,是TGA的话,再试试
string s=string(pModel->pMaterials[i].strFile);
size_t tmp,tmp1,tmp2;
tmp1=s.rfind(".tga");tmp2=s.rfind(".TGA");//是否是TGA文件
if ((tmp1==s.length()-4)||(tmp2==s.length()-4)){
char szPath[MAX_PATH+1];
GetCurrentDirectory(MAX_PATH, szPath); // 获得工程的目录
strcat(szPath, PICPATH); // 在工作目录加上"\\Data\\pic\\"
strcat(szPath, s.data()); // 后面加上文件名
tmp=LoadTGATexture(szPath, pModel->texture[pObject->materialID]);//加载TGA纹理
if( tmp==true){
// 设置对象的纹理映射标志
pObject->bHasTexture = true;
}
//else{
//char strMessage[100];
//sprintf(strMessage, "file name : %s!", pModel->pMaterials[i].strFile);
//printf( "%s\n" , strMessage );
//MessageBox(NULL, strMessage, "Error", MB_OK);
//}
}
}
效果图:
后一个是未加时效果。