`
yanfaguanli
  • 浏览: 657868 次
文章分类
社区版块
存档分类
最新评论

3D游戏技术 - 大型3D地图优化渲染技术

 
阅读更多

目录(?)[+]

技术简介:

如果需要渲染一个大型3D地图,由于数据量,需要渲染的东西非常多,所以尤其一些慢一点的机器就会变得非常卡。

如下面这些会造成帧率(FPS)下降的图:

这样的图:

还有这样的魔兽世界的图:

还有这样的图:

上图我是指她的背景图啦,O(∩_∩)O~

到底暴雪是如何让这些场景流畅地渲染的呢?

那就必须想办法提高渲染速度,也就是帧率(FPS)要提高,才能使得游戏流畅。

像魔兽这样大型的游戏具体是用什么技术的,那不敢确定,但是会用到的相关技术会有:

1 地图分块剔除

2 kd树

3 BSP树

4 LOD技术

等等,最后把场景优化到极致,才能创造出伟大的游戏。每一种技术都需要挺长篇幅介绍的,本文就分析第一种技术:地图分块剔除技术(Sub-Grid Culling)

地图分块剔除技术分析

1 3D投影剔除(Frustum Culling)

把一个大地图分隔成由多个小地图实现,那么本来需要调用一次就画成的地图,现在需要多次调用,但是我们可以利用Frustum Culling(3D投影剔除-我觉得比较满意的翻译名词吧)技术优化渲染。

Frustum Culling的思路是:

每一个小块地图,我们计算相对应的AABB包围体;

如果这个AABB和Frustum不相交,那么就不用画这个小块地图。

Frustum是下面的形状:

如下图:大三角形代表Frustum,小方格代表小块地图,灰色小方格代表与Frustum相交,需要渲染,但是白色地带就不与Frustum相交,所以都不需要渲染,那么我们可以看出这就省了很多渲染内容,也就速度大大提高了。

也可以不使用分格和AABB方法进行Frustum Culling:

把所有的组成地图的三角形输入显卡,让显卡自动裁剪不在Frustum中的三角形。但是其实这个裁剪发生在Clipping Stage,就差不多是渲染管道的最后的渲染工作了,那么这些不用渲染你的三角形就会通过大部分渲染管道,如:Vertex Shader,那么就浪费了很多计算呢时间。

使用分格和AABB的方法就可以简单的利用一个AABB相交测试就可以丢弃一个不用渲染的小块地图数据了,效率可以更大地提高。

掌握这个分块的数量也很重要。如下图:

这样就是更加精细的分块了。需要渲染的面积更小,但是相对而言节省的也不多,而精细的分块也需要花费更多的计算时间,如:画基本元几何图形的函数调用次数也更多了,还有AABB相交测试也增多;

所谓过犹不及,要掌握好度很重要。到底分多少个小地图块是合适的,就需要实际分析了。

而且这里的Frustum Culling主要是节省了vertex shading的计算时间,如果一个图形是主要花费在pixel shanding上的话,比如大量的particles需要渲染,那么这种Frustum Culling方法就不会有太大的提速效果。

2 小地图数据结构体:

首先需要定义一个结构体来表示小地图块的数据,如下:

  1. structSubGrid
  2. {
  3. ID3DXMesh*mesh;
  4. AABBbox;
  5. //Forsorting.
  6. booloperator<(constSubGrid&rhs)const;
  7. conststaticintNUM_ROWS=33;
  8. conststaticintNUM_COLS=33;
  9. conststaticintNUM_TRIS=(NUM_ROWS-1)*(NUM_COLS-1)*2;
  10. conststaticintNUM_VERTS=NUM_ROWS*NUM_COLS;
  11. };

主要功能就是这个比较操作符,是根据该小地图块和Camera的距离来比较大小的。把所有的小地图块都按照离Camera的距离由进到远排序,那么就方便由进到远(前到后)的渲染方式渲染。这种方式的渲染可以提高速度,尤其是在渲染管道中pixel shader渲染是瓶颈的时候,当然如果vertex shader是瓶颈,那么就提高不明显。

基本原理就是:

1 更新像素(pixel)的时候,渲染器都进行了depth testing(深度测试),只有在距离镜头进的物体才会被渲染,否则就不渲染。

2 如果排序好的物体,前面渲染的物体都是距离近的,那么后面渲染的物体如果被前面的物体挡住了,那么就根本不需要渲染了。

3 如果不是排序好的话,前面渲染了距离远的物体,那么后面渲染的物体距离镜头更加近,就需要重新更新当前像素,造成重复浪费渲染。

  1. boolTerrain::SubGrid::operator<(constSubGrid&rhs)const
  2. {
  3. D3DXVECTOR3d1=box.center()-gCamera->pos();
  4. D3DXVECTOR3d2=rhs.box.center()-gCamera->pos();
  5. returnD3DXVec3LengthSq(&d1)<D3DXVec3LengthSq(&d2);
  6. }


3 计算出Frustum:

Frustum是从投影矩阵抽出来的。因为Frustum就是由投影矩阵定义的,也可以说两者都在实际上是一致的:

如投影示意图:

Frustum:

其实是概念上不一样,但是实际上一样的东西。不过应用也不一样。

下面是从投影矩阵抽出Frustum的程序:

  1. voidCamera::buildWorldFrustumPlanes()
  2. {
  3. //Note:Extractthefrustumplanesinworldspace.
  4. D3DXMATRIXVP=mView*mProj;
  5. D3DXVECTOR4col0(VP(0,0),VP(1,0),VP(2,0),VP(3,0));
  6. D3DXVECTOR4col1(VP(0,1),VP(1,1),VP(2,1),VP(3,1));
  7. D3DXVECTOR4col2(VP(0,2),VP(1,2),VP(2,2),VP(3,2));
  8. D3DXVECTOR4col3(VP(0,3),VP(1,3),VP(2,3),VP(3,3));
  9. //Planesfaceinward.
  10. mFrustumPlanes[0]=(D3DXPLANE)(col2);//near
  11. mFrustumPlanes[1]=(D3DXPLANE)(col3-col2);//far
  12. mFrustumPlanes[2]=(D3DXPLANE)(col3+col0);//left
  13. mFrustumPlanes[3]=(D3DXPLANE)(col3-col0);//right
  14. mFrustumPlanes[4]=(D3DXPLANE)(col3-col1);//top
  15. mFrustumPlanes[5]=(D3DXPLANE)(col3+col1);//bottom
  16. for(inti=0;i<6;i++)
  17. D3DXPlaneNormalize(&mFrustumPlanes[i],&mFrustumPlanes[i]);
  18. }

其中的数学原理却是比较复杂的,需要相当的图形学基础。

4 Frustum和AABB包围体的碰撞检测

下面是检测Frustum六个平面与AABB包围体碰撞的代码:

  1. boolCamera::isVisible(constAABB&box)const
  2. {
  3. //Testassumesfrustumplanesfaceinward.
  4. D3DXVECTOR3P;
  5. D3DXVECTOR3Q;
  6. //N*Q*P
  7. //|//
  8. //|//
  9. //-----/-----Plane-----/-----Plane
  10. ////|
  11. ////|
  12. //*P*QN
  13. //
  14. //PQformsdiagonalmostcloselyalignedwithplanenormal.
  15. //Foreachfrustumplane,findtheboxdiagonal(therearefourmain
  16. //diagonalsthatintersecttheboxcenterpoint)thatpointsinthe
  17. //samedirectionasthenormalalongeachaxis(i.e.,thediagonal
  18. //thatismostalignedwiththeplanenormal).Thentestifthebox
  19. //isinfrontoftheplaneornot.
  20. for(inti=0;i<6;++i)
  21. {
  22. //Foreachcoordinateaxisx,y,z...
  23. for(intj=0;j<3;++j)
  24. {
  25. //MakePQpointinthesamedirectionastheplanenormalonthisaxis.
  26. if(mFrustumPlanes[i][j]>=0.0f)
  27. {
  28. P[j]=box.minPt[j];
  29. Q[j]=box.maxPt[j];
  30. }
  31. else
  32. {
  33. P[j]=box.maxPt[j];
  34. Q[j]=box.minPt[j];
  35. }
  36. }
  37. //Ifboxisinnegativehalfspace,itisbehindtheplane,andthus,completely
  38. //outsidethefrustum.NotethatbecausePQpointsroughlyinthedirectionofthe
  39. //planenormal,wecandeducethatifQisoutsidethenPisalsooutside--thuswe
  40. //onlyneedtotestQ.
  41. if(D3DXPlaneDotCoord(&mFrustumPlanes[i],&Q)<0.0f)//outside
  42. returnfalse;
  43. }
  44. returntrue;
  45. }

因为Frustum有六个平面,所以要循环检测六次,只要任何一次AABB包围体是在平面负面的,那么就返回false,表示没有在Frustum内。

这样检测可以不用考虑这些平面并不是无限延伸的,而是当作一般平面来检测,简化了计算。

因为每个平面四面都有被其他平面包围着,如果AABB与该平面在Frustum外相交,那么AABB就会是在其他四个平面任一个平面的负面,所以会在和其他平面检测的时候,检测出来该AABB不在Frustum内。

可以参考我另外一个关于平面和AABB包围体碰撞检测的博客:http://blog.csdn.net/kenden23/article/details/16916327

5 最后就是渲染:

  1. voidTerrain::draw()
  2. {
  3. //Frustumcullsub-grids.
  4. std::list<SubGrid>visibleSubGrids;
  5. for(UINTi=0;i<mSubGrids.size();++i)
  6. {
  7. if(gCamera->isVisible(mSubGrids[i].box))
  8. visibleSubGrids.push_back(mSubGrids[i]);
  9. }
  10. //Sortfront-to-backfromcamera.
  11. visibleSubGrids.sort();
  12. mFX->SetMatrix(mhViewProj,&gCamera->viewProj());
  13. mFX->SetTechnique(mhTech);
  14. UINTnumPasses=0;
  15. mFX->Begin(&numPasses,0);
  16. mFX->BeginPass(0);
  17. for(std::list<SubGrid>::iteratoriter=visibleSubGrids.begin();iter!=visibleSubGrids.end();++iter)
  18. HR(iter->mesh->DrawSubset(0));
  19. mFX->EndPass();
  20. mFX->End();
  21. }

渲染步骤:

1 先检测是否可见,即是否与Frustum相交,相交的放入一个list容器中。

  1. std::list<SubGrid>visibleSubGrids;
  2. for(UINTi=0;i<mSubGrids.size();++i)
  3. {
  4. if(gCamera->isVisible(mSubGrids[i].box))
  5. visibleSubGrids.push_back(mSubGrids[i]);
  6. }


2 按照离镜头的远近排序:

  1. //Sortfront-to-backfromcamera.
  2. visibleSubGrids.sort();

3 最后就是逐个小地图块渲染

  1. for(std::list<SubGrid>::iteratoriter=visibleSubGrids.begin();iter!=visibleSubGrids.end();++iter)
  2. HR(iter->mesh->DrawSubset(0));


其他代码是Shader渲染设置。

6 实现地图分块剔除技术关键步骤总结:

1 地图分块,定义好保存数据的结构体,包含AABB包围体

2 根据投影矩阵,计算Frustum

3 检测Frustum和小地图块的AABB包围体是否碰撞,保存好碰撞的小地图块

4 根据离镜头远近排序可见的(即碰撞的)小地图块,按循序渲染

下面是应用了本技术的效果图:

技术简介:

如果需要渲染一个大型3D地图,由于数据量,需要渲染的东西非常多,所以尤其一些慢一点的机器就会变得非常卡。

如下面这些会造成帧率(FPS)下降的图:

这样的图:

还有这样的魔兽世界的图:

还有这样的图:

上图我是指她的背景图啦,O(∩_∩)O~

到底暴雪是如何让这些场景流畅地渲染的呢?

那就必须想办法提高渲染速度,也就是帧率(FPS)要提高,才能使得游戏流畅。

像魔兽这样大型的游戏具体是用什么技术的,那不敢确定,但是会用到的相关技术会有:

1 地图分块剔除

2 kd树

3 BSP树

4 LOD技术

等等,最后把场景优化到极致,才能创造出伟大的游戏。每一种技术都需要挺长篇幅介绍的,本文就分析第一种技术:地图分块剔除技术(Sub-Grid Culling)

地图分块剔除技术分析

1 3D投影剔除(Frustum Culling)

把一个大地图分隔成由多个小地图实现,那么本来需要调用一次就画成的地图,现在需要多次调用,但是我们可以利用Frustum Culling(3D投影剔除-我觉得比较满意的翻译名词吧)技术优化渲染。

Frustum Culling的思路是:

每一个小块地图,我们计算相对应的AABB包围体;

如果这个AABB和Frustum不相交,那么就不用画这个小块地图。

Frustum是下面的形状:

如下图:大三角形代表Frustum,小方格代表小块地图,灰色小方格代表与Frustum相交,需要渲染,但是白色地带就不与Frustum相交,所以都不需要渲染,那么我们可以看出这就省了很多渲染内容,也就速度大大提高了。

也可以不使用分格和AABB方法进行Frustum Culling:

把所有的组成地图的三角形输入显卡,让显卡自动裁剪不在Frustum中的三角形。但是其实这个裁剪发生在Clipping Stage,就差不多是渲染管道的最后的渲染工作了,那么这些不用渲染你的三角形就会通过大部分渲染管道,如:Vertex Shader,那么就浪费了很多计算呢时间。

使用分格和AABB的方法就可以简单的利用一个AABB相交测试就可以丢弃一个不用渲染的小块地图数据了,效率可以更大地提高。

掌握这个分块的数量也很重要。如下图:

这样就是更加精细的分块了。需要渲染的面积更小,但是相对而言节省的也不多,而精细的分块也需要花费更多的计算时间,如:画基本元几何图形的函数调用次数也更多了,还有AABB相交测试也增多;

所谓过犹不及,要掌握好度很重要。到底分多少个小地图块是合适的,就需要实际分析了。

而且这里的Frustum Culling主要是节省了vertex shading的计算时间,如果一个图形是主要花费在pixel shanding上的话,比如大量的particles需要渲染,那么这种Frustum Culling方法就不会有太大的提速效果。

2 小地图数据结构体:

首先需要定义一个结构体来表示小地图块的数据,如下:

  1. structSubGrid
  2. {
  3. ID3DXMesh*mesh;
  4. AABBbox;
  5. //Forsorting.
  6. booloperator<(constSubGrid&rhs)const;
  7. conststaticintNUM_ROWS=33;
  8. conststaticintNUM_COLS=33;
  9. conststaticintNUM_TRIS=(NUM_ROWS-1)*(NUM_COLS-1)*2;
  10. conststaticintNUM_VERTS=NUM_ROWS*NUM_COLS;
  11. };

主要功能就是这个比较操作符,是根据该小地图块和Camera的距离来比较大小的。把所有的小地图块都按照离Camera的距离由进到远排序,那么就方便由进到远(前到后)的渲染方式渲染。这种方式的渲染可以提高速度,尤其是在渲染管道中pixel shader渲染是瓶颈的时候,当然如果vertex shader是瓶颈,那么就提高不明显。

基本原理就是:

1 更新像素(pixel)的时候,渲染器都进行了depth testing(深度测试),只有在距离镜头进的物体才会被渲染,否则就不渲染。

2 如果排序好的物体,前面渲染的物体都是距离近的,那么后面渲染的物体如果被前面的物体挡住了,那么就根本不需要渲染了。

3 如果不是排序好的话,前面渲染了距离远的物体,那么后面渲染的物体距离镜头更加近,就需要重新更新当前像素,造成重复浪费渲染。

  1. boolTerrain::SubGrid::operator<(constSubGrid&rhs)const
  2. {
  3. D3DXVECTOR3d1=box.center()-gCamera->pos();
  4. D3DXVECTOR3d2=rhs.box.center()-gCamera->pos();
  5. returnD3DXVec3LengthSq(&d1)<D3DXVec3LengthSq(&d2);
  6. }


3 计算出Frustum:

Frustum是从投影矩阵抽出来的。因为Frustum就是由投影矩阵定义的,也可以说两者都在实际上是一致的:

如投影示意图:

Frustum:

其实是概念上不一样,但是实际上一样的东西。不过应用也不一样。

下面是从投影矩阵抽出Frustum的程序:

  1. voidCamera::buildWorldFrustumPlanes()
  2. {
  3. //Note:Extractthefrustumplanesinworldspace.
  4. D3DXMATRIXVP=mView*mProj;
  5. D3DXVECTOR4col0(VP(0,0),VP(1,0),VP(2,0),VP(3,0));
  6. D3DXVECTOR4col1(VP(0,1),VP(1,1),VP(2,1),VP(3,1));
  7. D3DXVECTOR4col2(VP(0,2),VP(1,2),VP(2,2),VP(3,2));
  8. D3DXVECTOR4col3(VP(0,3),VP(1,3),VP(2,3),VP(3,3));
  9. //Planesfaceinward.
  10. mFrustumPlanes[0]=(D3DXPLANE)(col2);//near
  11. mFrustumPlanes[1]=(D3DXPLANE)(col3-col2);//far
  12. mFrustumPlanes[2]=(D3DXPLANE)(col3+col0);//left
  13. mFrustumPlanes[3]=(D3DXPLANE)(col3-col0);//right
  14. mFrustumPlanes[4]=(D3DXPLANE)(col3-col1);//top
  15. mFrustumPlanes[5]=(D3DXPLANE)(col3+col1);//bottom
  16. for(inti=0;i<6;i++)
  17. D3DXPlaneNormalize(&mFrustumPlanes[i],&mFrustumPlanes[i]);
  18. }

其中的数学原理却是比较复杂的,需要相当的图形学基础。

4 Frustum和AABB包围体的碰撞检测

下面是检测Frustum六个平面与AABB包围体碰撞的代码:

  1. boolCamera::isVisible(constAABB&box)const
  2. {
  3. //Testassumesfrustumplanesfaceinward.
  4. D3DXVECTOR3P;
  5. D3DXVECTOR3Q;
  6. //N*Q*P
  7. //|//
  8. //|//
  9. //-----/-----Plane-----/-----Plane
  10. ////|
  11. ////|
  12. //*P*QN
  13. //
  14. //PQformsdiagonalmostcloselyalignedwithplanenormal.
  15. //Foreachfrustumplane,findtheboxdiagonal(therearefourmain
  16. //diagonalsthatintersecttheboxcenterpoint)thatpointsinthe
  17. //samedirectionasthenormalalongeachaxis(i.e.,thediagonal
  18. //thatismostalignedwiththeplanenormal).Thentestifthebox
  19. //isinfrontoftheplaneornot.
  20. for(inti=0;i<6;++i)
  21. {
  22. //Foreachcoordinateaxisx,y,z...
  23. for(intj=0;j<3;++j)
  24. {
  25. //MakePQpointinthesamedirectionastheplanenormalonthisaxis.
  26. if(mFrustumPlanes[i][j]>=0.0f)
  27. {
  28. P[j]=box.minPt[j];
  29. Q[j]=box.maxPt[j];
  30. }
  31. else
  32. {
  33. P[j]=box.maxPt[j];
  34. Q[j]=box.minPt[j];
  35. }
  36. }
  37. //Ifboxisinnegativehalfspace,itisbehindtheplane,andthus,completely
  38. //outsidethefrustum.NotethatbecausePQpointsroughlyinthedirectionofthe
  39. //planenormal,wecandeducethatifQisoutsidethenPisalsooutside--thuswe
  40. //onlyneedtotestQ.
  41. if(D3DXPlaneDotCoord(&mFrustumPlanes[i],&Q)<0.0f)//outside
  42. returnfalse;
  43. }
  44. returntrue;
  45. }

因为Frustum有六个平面,所以要循环检测六次,只要任何一次AABB包围体是在平面负面的,那么就返回false,表示没有在Frustum内。

这样检测可以不用考虑这些平面并不是无限延伸的,而是当作一般平面来检测,简化了计算。

因为每个平面四面都有被其他平面包围着,如果AABB与该平面在Frustum外相交,那么AABB就会是在其他四个平面任一个平面的负面,所以会在和其他平面检测的时候,检测出来该AABB不在Frustum内。

可以参考我另外一个关于平面和AABB包围体碰撞检测的博客:http://blog.csdn.net/kenden23/article/details/16916327

5 最后就是渲染:

  1. voidTerrain::draw()
  2. {
  3. //Frustumcullsub-grids.
  4. std::list<SubGrid>visibleSubGrids;
  5. for(UINTi=0;i<mSubGrids.size();++i)
  6. {
  7. if(gCamera->isVisible(mSubGrids[i].box))
  8. visibleSubGrids.push_back(mSubGrids[i]);
  9. }
  10. //Sortfront-to-backfromcamera.
  11. visibleSubGrids.sort();
  12. mFX->SetMatrix(mhViewProj,&gCamera->viewProj());
  13. mFX->SetTechnique(mhTech);
  14. UINTnumPasses=0;
  15. mFX->Begin(&numPasses,0);
  16. mFX->BeginPass(0);
  17. for(std::list<SubGrid>::iteratoriter=visibleSubGrids.begin();iter!=visibleSubGrids.end();++iter)
  18. HR(iter->mesh->DrawSubset(0));
  19. mFX->EndPass();
  20. mFX->End();
  21. }

渲染步骤:

1 先检测是否可见,即是否与Frustum相交,相交的放入一个list容器中。

  1. std::list<SubGrid>visibleSubGrids;
  2. for(UINTi=0;i<mSubGrids.size();++i)
  3. {
  4. if(gCamera->isVisible(mSubGrids[i].box))
  5. visibleSubGrids.push_back(mSubGrids[i]);
  6. }


2 按照离镜头的远近排序:

  1. //Sortfront-to-backfromcamera.
  2. visibleSubGrids.sort();

3 最后就是逐个小地图块渲染

  1. for(std::list<SubGrid>::iteratoriter=visibleSubGrids.begin();iter!=visibleSubGrids.end();++iter)
  2. HR(iter->mesh->DrawSubset(0));


其他代码是Shader渲染设置。

6 实现地图分块剔除技术关键步骤总结:

1 地图分块,定义好保存数据的结构体,包含AABB包围体

2 根据投影矩阵,计算Frustum

3 检测Frustum和小地图块的AABB包围体是否碰撞,保存好碰撞的小地图块

4 根据离镜头远近排序可见的(即碰撞的)小地图块,按循序渲染

下面是应用了本技术的效果图:

分享到:
评论

相关推荐

    基于OpenGL的Android+3D游戏开发技术详解与典型案例(源码)

     本书的内容详细,且几乎涵盖了Android 3D游戏开发所有相关的技术,并向读者介绍了真实项目的开发流程,主要面向以下读者。  Android的初学者  本书详细介绍了OpenGL ES的基础知识,并对Android 3D游戏程序的开发...

    TrueVision3D 6. 5 商业3D游戏引擎 特别版 3/6

    5 3D游戏引擎 无功能限制,仅限学习使用,请不要用与商业开发 6.5版包含:3D引擎,多媒体引擎,网络引擎。SDK内包含许多工具用以加速开发: 阴影编辑器,模型查看器,多种模型格式输出插件以及特殊效果编辑器。...

    Unity小地图插件 UGUI MiniMap 2.4.1 资源商店最新版本 兼容2019.4.25或更高

    你可以很容易地为任何类型的游戏,如赛车,FPS,RPG,RTS游戏等创建任何类型的小地图。 小矩形和小矩形地图。 -实时和图片渲染模式。 -支持内置和通用渲染管道。 -针对移动平台进行了优化。 -指南针 -边框图标 -世界...

    TrueVision3D 6. 5 商业3D游戏引擎 特别版 6/6

    5 3D游戏引擎 无功能限制,仅限学习使用,请不要用与商业开发 6.5版包含:3D引擎,多媒体引擎,网络引擎。SDK内包含许多工具用以加速开发: 阴影编辑器,模型查看器,多种模型格式输出插件以及特殊效果编辑器。...

    TrueVision3D 6. 5 商业3D游戏引擎 特别版 2/6

    5 3D游戏引擎 无功能限制,仅限学习使用,请不要用与商业开发 6.5版包含:3D引擎,多媒体引擎,网络引擎。SDK内包含许多工具用以加速开发: 阴影编辑器,模型查看器,多种模型格式输出插件以及特殊效果编辑器。...

    ie3D:基于OGL ES 2.0,OGL CP 3.2的OSX iOS 3d游戏引擎

    基于OGL ES 2.0、3.0的跨平台3d游戏引擎。 ie3D-Core-是核心功能层。 它包括低级渲染系统,材质系统,资源系统等。 ie3D-Engine-是引擎抽象的第二层。 它包括基本核心层的扩展,例如复杂模型,自定义模型等。 ie...

    TrueVision3D 6. 5 商业3D游戏引擎 特别版 5/6

    5 3D游戏引擎 无功能限制,仅限学习使用,请不要用与商业开发 6.5版包含:3D引擎,多媒体引擎,网络引擎。SDK内包含许多工具用以加速开发: 阴影编辑器,模型查看器,多种模型格式输出插件以及特殊效果编辑器。...

    TrueVision3D 6. 5 商业3D游戏引擎 特别版 4/6

    5 3D游戏引擎 无功能限制,仅限学习使用,请不要用与商业开发 6.5版包含:3D引擎,多媒体引擎,网络引擎。SDK内包含许多工具用以加速开发: 阴影编辑器,模型查看器,多种模型格式输出插件以及特殊效果编辑器。...

    TrueVision3D 6. 5 商业3D游戏引擎 特别版 1/6

    5 3D游戏引擎 无功能限制,仅限学习使用,请不要用与商业开发 6.5版包含:3D引擎,多媒体引擎,网络引擎。SDK内包含许多工具用以加速开发: 阴影编辑器,模型查看器,多种模型格式输出插件以及特殊效果编辑器。...

    MATLAB下的FPS特拳行动3DOperationEigenfaust3D-opeig3d.zip

    本人将此游戏Demo的名称更改为《特拳行动3D》(Operation Eigenfaust 3D),并已删除了随该Demo附带(尽管并未使用)的与德军有关的标志,徽章,和画像等图形素材。特此说明。另,Operation Eigenfaust是一个恶搞的...

    【Unity插件资源】UGUI MiniMap v2.5.1

    包括手机,使用图片模式,你可以使用附带的自动烘烤工具烘烤你的地图,你可以只用一个绘图调用来渲染你的整个地图,对于大地图,烘烤工具也支持集群烘烤,允许地图渲染在多个区域烘烤,以最小的性能成本获得高度精确...

    Scratch 3D 渲染闯关游戏:英雄

    游戏是完全直观的,只需点击你想互动的地方,你就有了一所房子,一个你可以参观的城市,当你升级时,你会解锁新的地图,你可以走到屏幕边缘访问这些地图,它会解锁一个面板,点击后会打开英雄虚构世界的地图!...

    Scratch 3D 渲染枪战游戏:绝地求生 在线游戏

    【M】表示地图(再次按下关闭); 【L】代表排行榜(再次按下关闭); 【E】表示emote(再次按下可关闭); 【1 / 2 / 3 / 4】更换武器; 此后仍有作品或有趣游戏,可以进行学习与借鉴。请关注作者,且点赞加收藏,...

    Scratch 3D 渲染 操控游戏:幸存者 多人游戏.sb3

    试着通过障碍物,不要触摸荆棘、箭、尖锐的物体和篝火,建议每次尝试不同的路径,有两种方法可以完成,如果你到达终点,你会得到50个硬币,但每个地图只有一个50个硬币。 有钱的话,你可以在杂货店买到枪皮 斧头的...

    Cocos2D-X游戏开发技术精解

    6.3.3 制作一张游戏地图 170 6.3.4 编辑器中的属性功能 172 6.4 砖块地图Tile Map 173 6.5 地图数据的格式 175 6.5.1 编辑器导出的文件 175 6.5.2 地图文件分析 176 6.6 砖块地图的实现 178 6.6.1 砖块地图类...

    Scratch 操控3D渲染游戏:枪手的成长.sb3

    你可以通过在boss治疗时按下q来激活地图顶部的警报来防止它。等级2:当它击中你时,Boss会痊愈,雨水会使Boss的电攻击造成更大的伤害,当Boss跳跃时躲在障碍物后面以防止冲击波伤害。 此后仍有作品或有趣游戏,可以...

    3D-harp.gl.zip

    3D-harp.gl.zip,harp.gl-Web地图渲染引擎,3D建模使用专门的软件来创建物理对象的数字模型。它是3D计算机图形的一个方面,用于视频游戏,3D打印和VR,以及其他应用程序。

    自己写的3D赛车游戏

    我的第一个3D游戏,3D赛车游戏,dX的初始化,Win32应用程序,灵活的Camera类,.X静态文件的渲染,长方体天空盒,简单的地图,简单的物理引擎

Global site tag (gtag.js) - Google Analytics