游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3886|回复: 8

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

[复制链接]

8

主题

44

帖子

115

积分

注册会员

Rank: 2

积分
115
发表于 2011-2-8 11:27:00 | 显示全部楼层 |阅读模式
只有个白色的透明的 物品 纹理无法贴上去 [em17] [em17] [em17] [em17] [em17] [em17] [em17]


//加载x文件的核心函数(D3D::Mesh网* p的网格, x文件的文件名)
int d3d::InitMesh(d3d::Mesh* pMesh, LPCTSTR xfilename)
{         
        pMesh->pMaterialVector = new std::vector<D3DMATERIAL9>; // 模型的材质容器(一个模型可以有多个材质)

        pMesh->pTexVector = new std::vector<IDirect3DTexture9*>;// 模型的纹理容器(一个模型可以有多个纹理)

        ID3DXBuffer* adjBuffer = NULL;//缓冲区// 材质缓冲

        ID3DXBuffer* mtrlBuffer = NULL;//缓冲区

        DWORD numMtrls = 0;// 材质的数量(等于纹理数量)//DWORD 现在表示 32bit 无符号整数
            //   D3DXLoadMeshFromX载入.x文件
        HRESULT hr = D3DXLoadMeshFromX(
                xfilename,// [输入].x文件名

        D3DXMESH_MANAGED,/*创建Mesh的标志不含动画的普通X文件,有一个Mesh单元,
                                                 保存了各顶点信息、各三角面的索引信息、材质种类及定义等*/
       
                s_pDevice,// [输入]d3d设备指针


                &adjBuffer,//使用ID3DXBuffer返回Mesh的邻接信息,这是一个DWORD数组

                &mtrlBuffer,//使用ID3DXBuffer返回Mesh的材质数据,这是一个D3DXMATERIAL类型数组

                0,// [输出]获取模型的材质缓冲


                &numMtrls,//// [输出]材质的数量


                &pMesh->pMesh//返回ID3DXMesh对象[输出]模型对象指针

                );
        if (FAILED(hr))
        {
                debug::MessageBox("读取.X文件失败!");
                return 0;
        }

   //如果(mtrl缓冲区!= NULL &&返回Mesh对象的材质数量!= 0)
        if (mtrlBuffer != NULL && numMtrls != 0)//numMtrls,返回Mesh对象的材质数量
        {
                D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();// 获取材质指针

                for (int i=0; i<numMtrls; ++i)//返回Mesh对象的材质数量
                {   // 把需要的材质拷贝到我们的材质对象中
                        mtrls.MatD3D.Ambient = mtrls.MatD3D.Diffuse;
           
          //p网格-> P材料载体->//push_back在字符串之后插入一个字符
                        pMesh->pMaterialVector->push_back(mtrls.MatD3D);
            //if(mtrls.p纹理文件名 != NULL)
                        if(mtrls.pTextureFilename != NULL)
                        {
                                IDirect3DTexture9* pTex = NULL;//IDirect3D纹理9* pTex = NULL;

                                D3DXCreateTextureFromFile//D3DX从X文件创建对应纹理
                                        (
                                        s_pDevice,//设备
                                        mtrls.pTextureFilename,//p纹理文件名
                                        &pTex// 指向一个纹理地址的指针

                                        );
                                pMesh->pTexVector->push_back(pTex);//纹理对象//push_back在字符串之后插入一个字符
                        }
                        else
                        {
                                pMesh->pTexVector->push_back(NULL);
                        }
                }
               
                SAFE_RELEASE(mtrlBuffer);
        }

        return 1;
}
        //清除网格(D3D::网* p的网格)
int d3d::ClearMesh(d3d::Mesh* pMesh)
{
        for (int i=0; i<pMesh->pTexVector->size(); ++i)
        {
                SAFE_RELEASE(pMesh->pTexVector->at(i));
        }
        SAFE_DELETE(pMesh->pTexVector);
        SAFE_DELETE(pMesh->pMaterialVector);
        SAFE_RELEASE(pMesh->pMesh);
        return 1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//下面是两个不同的渲染函数程序中都有应用
////////////////////////////////////////////////////////////////////////////////////////////////////
        
int d3d::RenderMesh(d3d::Mesh* pMesh)
{
        for ( int i=0; i < pMesh->pMaterialVector->size(); ++i )
        { // 为这一部分设置材质
      //d3d设备指针->设定材质(  材质对象数组   )
                s_pDevice->SetMaterial( &pMesh->pMaterialVector->at(i) );
          //d3d设备指针->设定纹理(0,模型的纹理数组)
                s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
       // 渲染这一部分
                pMesh->pMesh->DrawSubset(i);
        }
        return 1;
}
       int d3d::RenderTeamMesh(d3d::Mesh* pMesh, D3DMATERIAL9* pMaterial, int iPart)
{// 根据材质的数量我们的模型被切分了,每个材质对应一部分
    // 所以渲染的时候也要分几个部分渲染

        for ( int i=0; i < iPart; ++i )
        {   //d3d设备指针->设定材质(  材质对象数组   )
                s_pDevice->SetMaterial( &pMesh->pMaterialVector->at(i) );
        //d3d设备指针->设定纹理(0,模型的纹理数组)
                s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
        // 渲染这一部分
                pMesh->pMesh->DrawSubset(i);
        }
// 为这一部分设置材质

//d3d设备指针->设定材质(  材质对象数组 )
        s_pDevice->SetMaterial( pMaterial );//设置素材(材质容器)
//d3d设备指针->设定纹理(0,模型的纹理数组)
        s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
// 渲染这一部分
        pMesh->pMesh->DrawSubset(iPart);

        for (i=iPart+1; i < pMesh->pMaterialVector->size(); ++i )
        {// 为这一部分设置材质
                s_pDevice->SetMaterial( &pMesh->pMaterialVector->at(i) );
                s_pDevice->SetTexture( 0, pMesh->pTexVector->at(i) );
     // 渲染这一部分
                pMesh->pMesh->DrawSubset(i);
        }
        return 1;
}

2

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2011-2-8 22:58:00 | 显示全部楼层

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

.X文件里只记录了纹理的相对路径,你得自己加载纹理

8

主题

44

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2011-2-9 14:38:00 | 显示全部楼层

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

问题出在那里???

8

主题

44

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2011-2-12 08:15:00 | 显示全部楼层

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

是不是X文件本身的问题?

33

主题

159

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
QQ
发表于 2011-2-14 15:51:00 | 显示全部楼层

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

把纹理图片跟X文件放在一个目录下面试试

8

主题

44

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2011-2-14 16:12:00 | 显示全部楼层

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

在一起的

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2011-2-21 17:58:00 | 显示全部楼层

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

下断点 断下看看
1. 纹理创建的地方是否成功
2. 加载时的纹理是否对头 你可以把 纹理的大小什么的打印出来看看

如果发现 纹理有改动过 可以尝试数据断点 然后查看堆栈看下哪步弄错了

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2011-2-22 00:36:00 | 显示全部楼层

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

用自己的格式最好,更清晰、更容易掌控。

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2011-2-27 11:20:00 | 显示全部楼层

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

用自己格式前也得先学下别人的吧,还是把渲染流程弄懂最重要 强烈推荐 <Focus on 3D model>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-6 15:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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