使用DirectX / C ++在不同位置渲染多个网格对象的有效方法

时间:2014-01-14 04:39:03

标签: c++ directx-9

当仅使用一个平移矩阵时,多个网格在屏幕上显示重叠。

我尝试的解决方案是创建多个平移矩阵,为每个网格设置不同的初始xyz坐标。它可以工作,但就使用的代码行数而言,这种方法似乎效率很低。 (最终项目可能包含20多个网格,所以我希望我不需要使用基本相同的代码段创建20个不同的翻译矩阵。)

我非常感谢有关使用最有效的代码来渲染多个网格的最佳方法的任何建议(即最少重复次数的指令最少)。

这只是一个小型的图形演示,因此获得高帧率不是优先考虑因素,但是通过最有效地使用代码来实现结果是。

以下代码是我目前如何在不同位置呈现多个网格的示例...

 // initial locations for each mesh
    D3DXVECTOR3 Translate1(-30.0f, 0.0f, 0.0f);                     
    D3DXVECTOR3 Translate2(-30.0f, 10.0f, 0.0f);            
    D3DXVECTOR3 Translate3(0.0f, 0.0f, 0.0f);               
    D3DXVECTOR3 Translate4(0.0f, 10.0f, 0.0f);              

    //set scaling on all x y and z axis
    D3DXVECTOR3 Scaling(g_ScaleX, g_ScaleY, g_ScaleZ);



    /////////////////////////////////////////////////////////////////////////

    // create first transformation matrix
    D3DXMATRIX world1; 

    // create first translation matrix
    D3DXMATRIX matrixTranslate;     

    D3DXMatrixTransformation(&world1, &ScalingCentre, &ScalingRotation, &Scaling, &RotationCentre, &Rotation, &Translate1);

    //D3DXMatrixIdentity(&world1);  // set world1 as current transformation matrix

    // set world1 as current transformation matrix for future meshes
    g_pd3dDevice -> SetTransform(D3DTS_WORLD, &world1);

    // recompute normals
    g_pd3dDevice -> SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);

    // render first mesh
    mesh1.Render(g_pd3dDevice);

    /////////////////////////////////////////////////////////////////////////

    D3DXMATRIX world2;

    D3DXMATRIX matrixTranslate2;


    D3DXMatrixTransformation(&world2, &ScalingCentre, &ScalingRotation, &Scaling, &RotationCentre, &Rotation, &Translate2);


    // set world2 as current transformation matrix for future meshes
    g_pd3dDevice -> SetTransform(D3DTS_WORLD, &world2);

    // render second mesh
    mesh2.Render(g_pd3dDevice);


    ////////////////////////////////////////////////////////////////////////

    D3DXMATRIX world3;

    D3DXMATRIX matrixTranslate3;

    D3DXMatrixTransformation(&world3, &ScalingCentre, &ScalingRotation, &Scaling, &RotationCentre, &Rotation, &Translate3);


    // set world2 as current transformation matrix for future meshes
    g_pd3dDevice -> SetTransform(D3DTS_WORLD, &world3);

     //render thirdmesh
    mesh3.Render(g_pd3dDevice);

    //////////////////////////////////////////////////////////////////////

1 个答案:

答案 0 :(得分:3)

编辑:我认为有效的你意味着'紧凑的代码'(它通常意味着“减少CPU使用率”:) 在那种情况下,是的,我注意到你复制并粘贴了基本相同的代码。为什么不使用带参数的函数,包括变换和网格?这样,您可以编写一个绘制网格的函数,并为每个网格调用它。更好的是,还将网格存储在数组中,然后迭代数组,为每个元素调用draw函数。我想你应该阅读C / C ++的基础教程。玩得开心!

http://www.cplusplus.com/doc/tutorial/

原始评论:

计算和设置变换的成本远远低于渲染网格的成本,所以我认为这里没有问题我们可以帮助您解决。例如,你的帧率是低吗?

在考虑性能时(在计算机图形学或其他方面),尝试将您的问题表达为可衡量的陈述,而不是基于感觉的猜测。首先描述您的目的(例如,以良好的帧速率绘制多个网格),然后描述不起作用的内容,然后开发理论,然后进行测试。