经过调试,发现贴图总是为最后一个材质面的材质,这是在装载贴图时,最终装载贴图的地址是一样的。
通过调用
D3DX11CreateShaderResourceViewFromFileA(
ID3D11Device* pDevice,
LPCSTR pSrcFile,
D3DX11_IMAGE_LOAD_INFO *pLoadInfo,
ID3DX11ThreadPump* pPump,
ID3D11ShaderResourceView** ppShaderResourceView,
HRESULT* pHResult);
这个函数,把pSrcFile这个文件装载到 ID3D11ShaderResourceView 中 , 为什么贴图地址会一样呢?
在装载时使用下面的函数
//提取材质文件中材质信息
bool ObjLoader::ParseMaterialFile(ID3D11Device* device, char* fileName)
{
std::ifstream inFile; //声明一个文件输入流对象
std::string fullFileName = m_strResPath + fileName; //获取文件全名
inFile.open(fullFileName); //打开文件
if(inFile.fail()) //判断文件打开是否成功
{
return false;
}
ObjMaterial* pMat = nullptr; //声明一个ObjMaterial材质对象
while(true) //通过循环逐行读取材质文件中的内容
{
std::string input;
inFile>>input;
if(input == "newmtl") //如果读入input的值为newmtl则创建一个新材质信息
{
&

在使用D3D11加载OBJ模型并应用贴图时,发现所有贴图显示为最后一个材质的贴图。原因在于加载贴图时,虽然为每个材质创建了新的ID3D11ShaderResourceView,但它们引用了相同的内存地址。解决方案是正确管理材质对象的生命周期,确保每个材质都有独立的贴图资源。
最低0.47元/天 解锁文章
792

被折叠的 条评论
为什么被折叠?



