使用DirectX/C++在不同位置渲染多个网格对象的有效方法
Efficient way to render multiple mesh objects in different positions using DirectX / C++
仅使用一个平移矩阵时,屏幕上会出现多个网格重叠。
我尝试的解决方案是创建多个平移矩阵,为每个网格设置不同的初始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/
原始评论:
计算和设置变换的成本远小于渲染网格的成本,所以我认为我们可以帮助您解决任何问题。例如,你的帧速率低吗?
当考虑性能时(在计算机图形学或其他方面),试着把你的问题表达为一个可衡量的陈述,而不是基于感觉的猜测。首先描述你的目的(例如,以良好的帧速率绘制多个网格),然后描述什么不起作用,然后发展关于原因的理论,然后你可以测试这些理论。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 使用对象文件读取三角形数据网格
- 两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题
- c++OpenGL发布用存储在对象中的vbo和vao绘制网格
- 如何使对准对象自动筛选为屏幕,以便于像素网格
- 想要在从搅拌机导入的实体3D对象上绘制线框网格
- 使用DirectX/C++在不同位置渲染多个网格对象的有效方法
- 2D 阵列/网格中的对象移动
- 将对象位置与网格对齐
- 操纵网格对象中的索引
- 多个网格或单个网格中的多个对象
- 获取实例化几何对象的网格
- 使用带有纹理的.x文件网格会覆盖其他对象的颜色
- 检索CAD对象的网格点
- 如何在c++中操纵/移动一个网格中的对象
- 使用 OpenCV 对网格上的对象进行计数