3ds模型--完善TGA纹理显示

由前面知道,有几个模型不能显示纹理图,纹理文件名称被人改掉了,差不多都是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);
		//}
	}
}
效果图:

后一个是未加时效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值