游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1597|回复: 2

加载。x文件 SetTexture出错。请各位大侠指导

[复制链接]

1

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2009-7-19 03:44:00 | 显示全部楼层 |阅读模式
我在加载一个。x文件之后出现错误。错误代码如下

XFileLoad.exe 中的 0x4b6c799b 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcd7d 时发生访问冲突

基本代码如下

IDirect3DDevice9 *m_pIDirect3DDevice;
IDirect3DTexture9 **m_ppDirect3DTextureArray;


加载。x文件代码
bool CBasicXFile:oadXFile(TCHAR* szXFileName){
        if(FAILED(D3DXLoadMeshFromX(szXFileName,D3DXMESH_MANAGED,
                                        m_pIDirect3DDevice,&m_pAdjacencyBuffer,
                                                                &m_pMaterialBuffer,0,&m_dwMaterials,
                                                                &m_pD3DXMesh)))
        {
                MessageBox(NULL,"装入.X文件失败.","提示",0);
                return false;
        }
        if(m_pMaterialBuffer==NULL || m_dwMaterials==0)  
                return false;
        //需要从pD3DXMtrlBuffer指向的缓冲区中释放材质和纹理名称
        D3DXMATERIAL* pD3DXMaterial=(D3DXMATERIAL*)m_pMaterialBuffer->GetBufferPointer();

        if(pD3DXMaterial!=NULL)
        {
                m_pD3DMaterialArray = new D3DMATERIAL9[m_dwMaterials];
               
                m_ppDirect3DTextureArray = new IDirect3DTexture9*[m_dwMaterials];

                for(DWORD i=0;i<m_dwMaterials;i++)
                {
                        m_pD3DMaterialArray=pD3DXMaterial.MatD3D; //数组用法

                        if(pD3DXMaterial.pTextureFilename!=NULL)
                        {
                                if(FAILED(D3DXCreateTextureFromFile(m_pIDirect3DDevice,pD3DXMaterial.pTextureFilename,
                                                                                                        &m_ppDirect3DTextureArray)))
                                {
                                        m_ppDirect3DTextureArray=NULL;
                                }
                        }
                }
        }

        //DWORD a = m_ppDirect3DTextureArray[0];
        m_pD3DXMesh->OptimizeInplace(
                D3DXMESHOPT_COMPACT  |
                D3DXMESHOPT_ATTRSORT |
                D3DXMESHOPT_VERTEXCACHE,
                (DWORD*)m_pAdjacencyBuffer->GetBufferPointer(),
                NULL, NULL, NULL);
        m_pMaterialBuffer->Release();
        //m_pAdjacencyBuffer->Release();
        return true;
}


这段代码我在调试的时候发现 pD3DXMaterial.pTextureFilename 是为空的。

当运行到

for(DWORD i=0;i<m_dwMaterials;i++){
                m_pIDirect3DDevice->SetMaterial(&m_pD3DMaterialArray);

                m_pIDirect3DDevice->SetTexture(0,m_ppDirect3DTextureArray);
                m_pD3DXMesh->DrawSubset(i);
        }

               


m_pIDirect3DDevice->SetTexture(0,m_ppDirect3DTextureArray);这句话出错。
出错代码XFileLoad.exe 中的 0x4b6c799b 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcd7d 时发生访问冲突
别人的代码可以加载这个。x文件。。x文件我想是没有问题的。并且我试验过pTextureFilename 在别人的代码中也是为空的。求各位大侠帮小弟看看。小弟刚刚学习directX编程。


还有个问题。LPDIRECT3DDEVICE9 和 IDirect3DDevice9 在用法上有什么区别。
我在d3d9.h中看到。这样定义的。typedef struct IDirect3DTexture9 *LPDIRECT3DTEXTURE9, *PDIRECT3DTEXTURE9;
除了运用的时候 多加个* 还有别的区别吗?

34

主题

443

帖子

478

积分

中级会员

Rank: 3Rank: 3

积分
478
发表于 2009-7-19 09:07:00 | 显示全部楼层

Re:加载。x文件 SetTexture出错。请各位大侠指导

大概是因为:
你这个程序(好像是《DX9开发引导》里面的)装载.x时,因为没对纹理路径处理,只能用和.exe在同一个目录里的.x文件。。。

1

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2009-7-19 12:42:00 | 显示全部楼层

Re:加载。x文件 SetTexture出错。请各位大侠指导

这段程序是 《3D开发引导》里面的代码, 我吧。x文件放到和。exe同一个目录里面了。原先是tiger。x我换成别的文件就出现这个问题了。用tiger。x就没有问题。郁闷一晚上啊。!!!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-19 18:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表