游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2893|回复: 5

关于D3DX: D3DXCleanMesh的困惑

[复制链接]

6

主题

42

帖子

42

积分

注册会员

Rank: 2

积分
42
发表于 2005-8-2 13:46:00 | 显示全部楼层 |阅读模式
最近在做模型动态LOD,看了D9的ProgressiveMesh的例子.
写了个测试.直接拿球形MESH做PMESH,但是在做MESH整理就出错了.
    LPD3DXMESH   pMesh = NULL;
    LPD3DXPMESH  pPMesh = NULL;
    LPD3DXMESH   pTempMesh = NULL;
    HRESULT      hr;

    D3DXWELDEPSILONS Epsilons;       
       
    D3DXCreateSphere( g_pd3dDevice,
                1.0f,
                12,
                12,
                &pMesh,
                NULL
                );

     DWORD *Adj = new DWORD[3 * pMesh->GetNumFaces()];
     memset(Adj,0,sizeof(DWORD) * 3 * pMesh->GetNumFaces());
    //取得关联数据
    if ( pMesh->GenerateAdjacency(0.0, Adj) != D3D_OK )
   {
                ASSERT(FALSE);
   }

    // 整理MESH:问题出在这里D3D会报一个提示
    //"D3DX: D3DXCleanMesh:  Output Adjacency must be specified."
    //大概意思似乎是要指明Adj?
    if( FAILED( hr = D3DXCleanMesh( pMesh, Adj, &pTempMesh,
                                           Adj, NULL ) ) )
    {
            ASSERT(FALSE);

    }
    RELEASE(pMesh);
    pMesh = pTempMesh;

......
......



    各位高手有没有什么建议?D3D的那句提示该如何解释?

    谢谢!

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2005-8-2 14:51:00 | 显示全部楼层

Re:关于D3DX: D3DXCleanMesh的困惑

再分配一个output的Adjacency buffer
DWORD *AdjOut = new DWORD[3 * pMesh->GetNumFaces()];
然后在cleanmesh的时候,把第5个参数改成AdjOut

6

主题

42

帖子

42

积分

注册会员

Rank: 2

积分
42
 楼主| 发表于 2005-8-2 20:37:00 | 显示全部楼层

Re:关于D3DX: D3DXCleanMesh的困惑

我一开始也以为是这样,试了一下,仍然是相同的错误.

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2005-8-3 09:49:00 | 显示全部楼层

Re:关于D3DX: D3DXCleanMesh的困惑

d3dx输出的debug信息的确就是我说的错误
如果你换了adjout,还会有同样的错误,那么就请检查你的代码中
是否有多处需要更改

6

主题

42

帖子

42

积分

注册会员

Rank: 2

积分
42
 楼主| 发表于 2005-8-3 23:27:00 | 显示全部楼层

Re:关于D3DX: D3DXCleanMesh的困惑

我后来发现创建PMESH不一定需要做D3DXCleanMesh,大部分模型都成功了.

但是有另外一个问题,我在读自己的模型文件,创建LPD3DXMESH后,为了取得面的关联数据,调用
pMesh->GenerateAdjacency(0.0, Adj) != D3D_OK .
有一个模型在这里取得的Adj数据全是乱码.(大部分模型是对的)
代码如下:
                                //创建MESH
                               LPD3DXMESH pMesh;
                if(pNodeMesh)
                {
                        pMesh = pNodeMesh->CreateXMesh();
                }
                dw32BitFlag = ( pMesh->GetOptions() & D3DXMESH_32BIT );
       
                dwMeshFaces = pMesh->GetNumFaces();
                dwMeshVertices = pMesh->GetNumVertices();

                //取得关联数据
                DWORD *Adj = new DWORD[3 * dwMeshFaces];
                memset(Adj,0,sizeof(DWORD) * 3 * dwMeshFaces);
                //这里得到的Adj有一个模型始终不对.(函数并没有失败)
                if ( pMesh->GenerateAdjacency(0.0, Adj) != D3D_OK )
                {
                        ASSERT(FALSE);
                }
我在MAX里面看了这个模型,和其他模型没什么不同,而且在代码里RENDER这个mesh也能够显示出来.
请问在何种情况下GenerateAdjacency取得的值会是乱码?

6

主题

42

帖子

42

积分

注册会员

Rank: 2

积分
42
 楼主| 发表于 2005-8-4 18:27:00 | 显示全部楼层

Re:关于D3DX: D3DXCleanMesh的困惑

今天把这个问题解决了,所以再上来一下,原来GenerateAdjacency中得到的数据并非乱码,而是0xffffffff,意思是这个面的这个边上没有临接面.所以输出数据是对的.

再说说D3DXCleanMesh,当我换了DX9.0c SDK后,把
if( FAILED( hr = D3DXCleanMesh( pMesh, Adj, &pTempMesh,  Adj, NULL ) ) )
换成       
if( FAILED( hr = D3DXCleanMesh(D3DXCLEAN_SIMPLIFICATION, pMesh, Adj, &pTempMesh,  Adj, NULL ) ) )
立刻通过了,我一查才发现,原来我的机子上的D3D runtime一直是9.0c的


D3DXCleanMesh的调用函数在9.0和9.0c上不同,9.0c会多一个参数(D3DXCLEAN_SIMPLIFICATION)用于指明该接口以何种方式清理MESH.我之前用D9.0的SDK却用了D9.0C的RUNTIIME,所以出现这个问题.这也是DEBUG INFORMATION里提到的"Output Adjacency must be specified"的原因.

我这样的理解对吗?照理DIRECTX的COM结构应该可以避免版本冲突啊?

不管怎么说,LOD成功了,十分开心.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-26 18:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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