directx中第四卷

渐进网格

声明变量

ID3DXPMesh* PMesh = 0;

产生渐进网格

加载模型

hr = SourceMesh->OptimizeInplace(
    D3DXMESHOPT_ATTRSORT|
    D3DXMESHOPT_COMPACT|
    D3DXMESHOPT_VERTEXCACHE,
    (DWORD*)adjbuffer->GetBufferPointer(),
    (DWORD*)adjbuffer->GetBufferPointer(), //添加上优化后的邻接数组指针
    0,0
    );

if (FAILED(hr))
{
    ::MessageBox(0, "OptimizeInplace-lost", 0, 0);
    return false;
}
//由原网格生成渐进网格(网格指针,优化前的邻接数组指针,默认顶点属性权重,默认顶点权重,尽可能简化,简化面数,把结果存到网格指针)
hr = D3DXGeneratePMesh(
    SourceMesh,
    (DWORD*)adjbuffer->GetBufferPointer(),
    0,0,1,
    D3DXMESHSIMP_FACE,
    &PMesh
    );

if (FAILED(hr))
{
    ::MessageBox(0, "D3DXGeneratePMesh-lost", 0, 0);
    return false;
}

adjbuffer->Release();
//得到最大细节
DWORD maxfaces = PMesh->GetMaxFaces();
//设置细节
PMesh->SetNumFaces(maxfaces);

绘制模型

for (int i = 0; i < Mtrls.size(); i++)
{
    g_pd3dDevice->SetMaterial(&Mtrls[i]);
    g_pd3dDevice->SetTexture(0, Textures[i]);
    PMesh->DrawSubset(i);
    //绘制网格骨架,为了看到效果
    g_pd3dDevice->SetMaterial(&yellow_mtrl);
    g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
    PMesh->DrawSubset(i);
    g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
}

调整效果

int numfaces = PMesh->GetNumFaces();
if (::GetAsyncKeyState('A')&0x8000f)
{
    PMesh->SetNumFaces(numfaces + 10);
}

if (::GetAsyncKeyState('S')&0x8000f)
{
    PMesh->SetNumFaces(numfaces - 10);
}

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值