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

Efficient way to render multiple mesh objects in different positions using DirectX / C++

本文关键字:网格 对象 方法 有效 C++ DirectX 位置 使用      更新时间:2023-10-16

仅使用一个平移矩阵时,屏幕上会出现多个网格重叠。

我尝试的解决方案是创建多个平移矩阵,为每个网格设置不同的初始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);
//////////////////////////////////////////////////////////////////////

编辑:我明白高效的意思是"紧凑的代码"(它通常意味着"更少的cpu使用":)在这种情况下,是的,我注意到您复制和粘贴的代码基本上是相同的。为什么不使用一个接受参数的函数,包括变换和网格?这样,就可以编写一个绘制网格的函数,并为每个网格调用它。更好的是,还可以将网格存储在数组中,然后在数组上迭代,为每个元素调用draw函数。我认为你应该阅读一下C/C++的基本教程。玩得高兴

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

原始评论:

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

当考虑性能时(在计算机图形学或其他方面),试着把你的问题表达为一个可衡量的陈述,而不是基于感觉的猜测。首先描述你的目的(例如,以良好的帧速率绘制多个网格),然后描述什么不起作用,然后发展关于原因的理论,然后你可以测试这些理论。