DirectX9 SDK Samples(15) OptimizedMesh Sample

本文介绍了使用DirectX API对3D模型进行优化的过程,包括属性排序、strip顺序及顶点缓存优化,并展示了如何利用ID3DX10Mesh::Optimize等API将trianglelist转换为更高效的trianglestrip。

优化网格,主要是将triangle list优化成triangle strip。

主要用到的API有:ID3DX10Mesh::Optimize,D3DXConvertMeshSubsetToSingleStrip,D3DXConvertMeshSubsetToStrips

而渲染的时候对应用到的函数有:IDirect3DDevice9::SetStreamSource,IDirect3DDevice9::SetIndices,IDirect3DDevice9::DrawIndexedPrimitive

struct SStripData
{
    LPDIRECT3DINDEXBUFFER9 m_pStrips;          // strip indices (single strip)
    LPDIRECT3DINDEXBUFFER9 m_pStripsMany;      // strip indices (many strips)

    DWORD m_cStripIndices;
    DWORD* m_rgcStripLengths;
    DWORD m_cStrips;
//省略构造函数
};


struct SMeshData
{
    LPD3DXMESH m_pMeshSysMem;      // System memory copy of mesh

    LPD3DXMESH m_pMesh;            // Local version of mesh, copied on resize
    LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer;    // vertex buffer of mesh

    SStripData* m_rgStripData;      // strip indices split by attribute
    DWORD m_cStripDatas;
//省略析构构造函数
};
上面是两个这次例子定义的结构体。

1OnCreateDevice

    // Load mesh
    hr = LoadMeshData( pd3dDevice, MESHFILENAME, &pMeshSysMem, &pAdjacencyBuffer );
    if( SUCCEEDED( hr ) )
    {
        hr = OptimizeMeshData( pMeshSysMem, pAdjacencyBuffer, D3DXMESHOPT_ATTRSORT, &g_MeshAttrSorted );
        if( SUCCEEDED( hr ) )
            hr = OptimizeMeshData( pMeshSysMem, pAdjacencyBuffer, D3DXMESHOPT_STRIPREORDER, &g_MeshStripReordered );

        if( SUCCEEDED( hr ) )
            hr = OptimizeMeshData( pMeshSysMem, pAdjacencyBuffer,
                                   D3DXMESHOPT_VERTEXCACHE, &g_MeshVertexCacheOptimized );
    //省略
这里用到了自定义函数LoadMeshData,没什么特别,就是载入网格、材质和纹理。

然后分别进行了3种优化,根据属性排序、strip顺序和顶点缓存。


2OptimizeMeshData

    // Attribute sort - the un-optimized mesh option
    // remember the adjacency for the vertex cache optimization
    hr = pMeshSysMem->Optimize( dwOptFlags | D3DXMESH_SYSTEMMEM,
                                ( DWORD* )pAdjacencyBuffer->GetBufferPointer(),
                                NULL, NULL, NULL, &pMeshData->m_pMeshSysMem );
第一种优化,优化效果见注释

    pMeshData->m_cStripDatas = g_dwNumMaterials;
    pMeshData->m_rgStripData = new SStripData[ pMeshData->m_cStripDatas ];
    if( pMeshData->m_rgStripData == NULL )
    {
        hr = E_OUTOFMEMORY;
        goto End;
    }

    g_bCantDoSingleStrip = false;
    for( DWORD iMaterial = 0; iMaterial < g_dwNumMaterials; iMaterial++ )
    {
        hr = D3DXConvertMeshSubsetToSingleStrip( pMeshData->m_pMeshSysMem, iMaterial,
                                                 D3DXMESH_IB_MANAGED, &pMeshData->m_rgStripData[iMaterial].m_pStrips,
                                                 &pMeshData->m_rgStripData[iMaterial].m_cStripIndices );
//检查strip个数是否超出设备支持范围
对每一种材质先进行单个strip优化。
        hr = D3DXConvertMeshSubsetToStrips( pMeshData->m_pMeshSysMem, iMaterial,
                                            D3DXMESH_IB_MANAGED, &pMeshData->m_rgStripData[iMaterial].m_pStripsMany,
                                            NULL, &pbufTemp, &pMeshData->m_rgStripData[iMaterial].m_cStrips );
        pMeshData->m_rgStripData[iMaterial].m_rgcStripLengths = new
            DWORD[pMeshData->m_rgStripData[iMaterial].m_cStrips];
        memcpy( pMeshData->m_rgStripData[iMaterial].m_rgcStripLengths,
                pbufTemp->GetBufferPointer(),
                sizeof( DWORD ) * pMeshData->m_rgStripData[iMaterial].m_cStrips );
然后进行多strip优化。注意,这里pbufTemp返回了各个strip的长度,相当于一个DWORD数组(这里用的DWORD)。

3DrawMeshData

在OnFrameRender中调用。

        for( DWORD iMaterial = 0; iMaterial < g_dwNumMaterials; iMaterial++ )
        {
            if( !g_bShowStrips && !g_bShowSingleStrip )
            {
                V( pMeshData->m_pMesh->DrawSubset( iMaterial ) );
            }
            else  // drawing strips
            {
//省略
                V( pd3dDevice->SetFVF( dwFVF ) );
                V( pd3dDevice->SetStreamSource( 0, pMeshData->m_pVertexBuffer, 0, cBytesPerVertex ) );

                if( g_bShowSingleStrip )
                {
                    if( !g_bCantDoSingleStrip )
                    {
                        V( pd3dDevice->SetIndices( pMeshData->m_rgStripData[iMaterial].m_pStrips ) );

                        V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP, 0,
                                                             0, pMeshData->m_pMesh->GetNumVertices(),
                                                             0, pMeshData->m_rgStripData[iMaterial].m_cStripIndices -
                                                             2 ) );
                    }
                }
                else
                {
                    V( pd3dDevice->SetIndices( pMeshData->m_rgStripData[iMaterial].m_pStripsMany ) );

                    iCurFace = 0;
                    for( iStrip = 0; iStrip < pMeshData->m_rgStripData[iMaterial].m_cStrips; iStrip++ )
                    {
                        V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP, 0,
                                                             0, pMeshData->m_pMesh->GetNumVertices(),
                                                             iCurFace,
                                                             pMeshData->m_rgStripData[iMaterial].m_rgcStripLengths[iStrip] ) );

                        iCurFace += 2 + pMeshData->m_rgStripData[iMaterial].m_rgcStripLengths[iStrip];
                    }
                }
            }
        }
其中iCurFace是本次渲染的起始顶点的索引,CurrentFace,其实这名字有歧义,不是Face,而是Vertex。
内容概要:本文围绕“分布式电源接入配电网承载力评估方法”的研究展开,重点复现了一项基于双层鲸鱼优化算法求解的核心学术论文,结合Matlab编程实现,对IEEE 33节点配电网系统进行建模与仿真分析。研究旨在科学评估在大规模分布式电源接入背景下配电网的承载能力,构建了综合考虑系统运行安全性、电能质量、网络损耗及电压稳定性等多重约束条件的优化评估模型,并采用高效的智能优化算法进行求解,有效提升了评估精度与计算效率,为新能源并网规划、电网扩容改造及运行决策提供了可靠的理论依据和技术支撑。该资源不仅提供完整的代码实现,还深入解析算法设计逻辑与模型构建流程,具有较强的科研复现价值和工程参考意义。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力,从事新能源并网、智能配电网规划、电力系统优化、分布式能源管理等方向的研究生、科研人员及电力行业工程技术人员。; 使用场景及目标:① 学习并掌握分布式电源接入对配电网影响的量化评估方法;② 深入理解双层优化架构与智能算法(如鲸鱼优化算法)在复杂电力系统问题中的应用机制;③ 获取可运行、可调试的Matlab代码资源,用于科研论文复现、课题研究仿真、课程设计或工程项目前期论证。; 阅读建议:此资源以核心论文的技术路线为基础,强调理论与实践相结合。建议读者在阅读过程中结合电力系统潮流计算、约束优化等基础知识,逐步理解模型构建思路,并动手运行与调试所提供的Matlab代码,通过参数调整与结果分析深化对算法性能与工程适用性的认知,从而真正实现从“看懂”到“掌握”的转化。
内容概要:本文档聚焦于“并_离网风光互补制氢合成氨系统容量-调度优化分析”的Python代码实现,是一项面向能源系统优化领域的高水平科研复现工作。通过构建风能、光伏、电解水制氢及合成氨工艺的多能耦合系统模型,实现对系统容量配置与运行调度的联合优化,旨在提升可再生能源消纳能力、系统运行效率与经济性。研究采用双层鲸鱼优化算法等智能算法求解复杂的混合整数非线性规划(MINLP)问题,并结合YALMIP建模工具与Python编程环境完成系统仿真,适用于顶级EI期刊论文的模型复现与技术验证。; 适合人群:具备Python编程能力、优化理论基础及能源系统专业知识的科研人员,特别适合从事可再生能源集成、绿氢生产、综合能源系统、碳中和等相关方向的硕士/博士研究生及高校研究人员。; 使用场景及目标:①复现并深入理解顶级EI期刊中关于风光制氢合成氨系统的优化建模方法;②掌握多能互补系统建模、能量流平衡分析与设备容量优化配置的核心技术;③学习并应用双层优化算法、MINLP求解策略及不确定性处理方法;④支撑科研课题攻关、高水平论文撰写、项目申报及算法对比验证。; 阅读建议:建议优先下载并配置网盘提供的YALMIP-develop.zip等开发环境资源,仔细研读代码中关于风光出力预测、电解槽与合成氨反应器动态特性、电网交互模式(并网/离网)、设备投资与运行约束的数学表达,通过调试案例参数深入理解目标函数(如最小化年化成本)与决策变量的设计逻辑,进而开展个性化改进与扩展研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值