+ -
当前位置:首页 → 问答吧 → X文件能够加载但是不能够渲染 有几种可能的问题啊?

X文件能够加载但是不能够渲染 有几种可能的问题啊?

时间:2011-08-06

来源:互联网

只有个白色的透明的物体,这个x文件没有纹理文件,只有材质
一下是自己写的模型类里面的两个函数,真的不知道问题出在哪里。。希望大虾帮忙。。

CXModel的成员表为:
  LPDIRECT3DDEVICE9 m_device;
ID3DXMesh* Mesh;
D3DMATERIAL9* Mtrls;//材质数组
LPDIRECT3DTEXTURE9* Textures;//纹理指针数组
DWORD m_numMtrls;//材质数目

C/C++ code

bool CXModel::LoadXFile(char *file)
{
    HRESULT hr = 0;

    //加载x文件
    ID3DXBuffer* adjBuffer  = 0;//邻接信息
    ID3DXBuffer* mtrlBuffer = 0;
    DWORD        numMtrls   = 0;
    D3DXMATERIAL* mtrls=0;

    hr = D3DXLoadMeshFromX(  
        file,
        D3DXMESH_MANAGED,
        m_device,
        &adjBuffer,
        &mtrlBuffer,
        0,
        &numMtrls,
        &Mesh);

    m_numMtrls=numMtrls;
    if(FAILED(hr))
    {
        ::MessageBox(0, TEXT("加载x模型失败"), 0, 0);
        return false;
    }

    
    if( mtrlBuffer != 0 && numMtrls != 0 )//如果材质缓存不为空
    {

        Mtrls=new D3DMATERIAL9[numMtrls];
        Textures=new LPDIRECT3DTEXTURE9[numMtrls];
        mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();

        for(int i = 0; i < numMtrls; i++)
        {
            
            //mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;

            
            Mtrls[i]=mtrls[i].MatD3D ;

            
            if( mtrls[i].pTextureFilename != 0 )
            {
                
                IDirect3DTexture9* tex = 0;
                D3DXCreateTextureFromFile(
                    m_device,
                    mtrls[i].pTextureFilename,
                    &tex);

                
                Textures[i]= tex ;
            }
            else
            {
                
                Textures[i]= 0 ;
            }
        }
    }
    Release<ID3DXBuffer*>(mtrlBuffer); 
    //
    // Optimize the mesh.
    //

    hr = Mesh->OptimizeInplace(        
        D3DXMESHOPT_ATTRSORT |
        D3DXMESHOPT_COMPACT  |
        D3DXMESHOPT_VERTEXCACHE,
        (DWORD*)adjBuffer->GetBufferPointer(),
        0, 0, 0);

    Release<ID3DXBuffer*>(adjBuffer);

    if(FAILED(hr))
    {
        ::MessageBox(0, TEXT("优化网格失败"), 0, 0);
        return false;
    }
    return true;


}
void CXModel::Render(CVector3 pos)
{

    CMatrix4x4 mat;
    this->GetWorldMatrixFromPos(pos,mat);
    m_device->SetTransform(D3DTS_WORLD,(D3DXMATRIX*)(&mat)->matrix);

    for(int i = 0; i < m_numMtrls; i++)
        {
            m_device->SetMaterial( &Mtrls[i] );
            m_device->SetTexture(0, Textures[i]);
            Mesh->DrawSubset(i);
        }    
}


        

作者: woaitmac1314   发布时间: 2011-08-06

场景中,透明的物体需要最后渲染。

作者: dizuo   发布时间: 2011-08-07