Unity Minecraft我的世界核心渲染机制的简单实现 一个面的渲染

发表于2017-11-07
评论0 1.5k浏览

最近在看MC的代码,但是10M的代码看得我实在够呛,后来去找了一些Unity相关实现的工程,可惜国内都使用的是cube来做方块,渲染一万个方块还好,百万级别的就够呛了。

 

后来看了网友的建议后,翻墙去youtube上找了相关的视频,花了一个晚上把代码抄下来后,这几天把核心的渲染逻辑研究清楚了,给大家分享一下。

 

这边只是做一个面的渲染,一个方块的话就是6个面嘛,都一样的。

 

上代码:

  1. public class BlockTest : MonoBehaviour {  
  2.   
  3.     List<Vector3> vertices = new List<Vector3>();  
  4.     List<int> triangles = new List<int>();  
  5.     List<Vector2> uvs = new List<Vector2>();  
  6.   
  7.     void Start ()  
  8.     {  
  9.         block1();  
  10.     }  
  11.       
  12.     // 显示在y轴上方  
  13.     void block1()  
  14.     {  
  15.         MeshFilter filter = GetComponent<MeshFilter>();  
  16.   
  17.         // 顶点,观察点要顺时针绕才能看的见  
  18.         Vector3 v1 = new Vector3(-0.5f, 0.5f, -0.5f);  
  19.         Vector3 v2 = new Vector3(-0.5f, 0.5f, 0.5f);  
  20.         Vector3 v3 = new Vector3(0.5f, 0.5f, 0.5f);  
  21.         Vector3 v4 = new Vector3(0.5f, 0.5f, -0.5f);  
  22.         vertices.Add(v1);  
  23.         vertices.Add(v2);  
  24.         vertices.Add(v3);  
  25.         vertices.Add(v4);  
  26.   
  27.         // 三角网格  
  28.         triangles.Add(0);  
  29.         triangles.Add(1);  
  30.         triangles.Add(2);  
  31.   
  32.         triangles.Add(0);  
  33.         triangles.Add(2);  
  34.         triangles.Add(3);  
  35.   
  36.         // 贴图UV,这个是贴图的比例  
  37.         uvs.Add(new Vector2(0.333f, 0));  
  38.         uvs.Add(new Vector2(0.333f, 0.333f));  
  39.         uvs.Add(new Vector2(0.666f, 0.333f));  
  40.         uvs.Add(new Vector2(0.666f, 0));  
  41.   
  42.         // 渲染参数设定  
  43.         filter.mesh.Clear();  
  44.         filter.mesh.subMeshCount = 1;   //贴图数量只设定为一张  
  45.         filter.mesh.vertices = vertices.ToArray();  //设置顶点信息  
  46.         filter.mesh.SetTriangles(triangles.ToArray(), 0);   //设置三角网格  
  47.         filter.mesh.uv = uvs.ToArray(); //设置uv,贴图对应的顶点  
  48.   
  49.         // 开始重新渲染  
  50.         filter.mesh.RecalculateNormals();  
  51.     }  
  52.   
  53.     // 显示在y轴下方  
  54.     void block2()  
  55.     {  
  56.         MeshFilter filter = GetComponent<MeshFilter>();  
  57.   
  58.         // 顶点  
  59.         Vector3 v1 = new Vector3(-0.5f, 0.5f, -0.5f);  
  60.         Vector3 v2 = new Vector3(0.5f, 0.5f, -0.5f);  
  61.         Vector3 v3 = new Vector3(0.5f, 0.5f, 0.5f);  
  62.         Vector3 v4 = new Vector3(-0.5f, 0.5f, 0.5f);  
  63.         vertices.Add(v1);  
  64.         vertices.Add(v2);  
  65.         vertices.Add(v3);  
  66.         vertices.Add(v4);  
  67.   
  68.         // 三角网格  
  69.         triangles.Add(0);  
  70.         triangles.Add(1);  
  71.         triangles.Add(2);  
  72.   
  73.         triangles.Add(0);  
  74.         triangles.Add(2);  
  75.         triangles.Add(3);  
  76.   
  77.         // 贴图UV  
  78.         uvs.Add(new Vector2(0.333f, 0));  
  79.         uvs.Add(new Vector2(0.666f, 0));  
  80.         uvs.Add(new Vector2(0.666f, 0.333f));  
  81.         uvs.Add(new Vector2(0.333f, 0.333f));  
  82.           
  83.   
  84.         filter.mesh.Clear();  
  85.         filter.mesh.subMeshCount = 1;  
  86.         filter.mesh.vertices = vertices.ToArray();  
  87.         filter.mesh.SetTriangles(triangles.ToArray(), 0);  
  88.         filter.mesh.uv = uvs.ToArray();  
  89.         filter.mesh.RecalculateNormals();  
  90.     }  
  91.   
  92.     // 这个是错误的  
  93.     void block3()  
  94.     {  
  95.         MeshFilter filter = GetComponent<MeshFilter>();  
  96.   
  97.         // 顶点  
  98.         Vector3 v1 = new Vector3(-0.5f, 0.5f, -0.5f);  
  99.         Vector3 v2 = new Vector3(0.5f, 0.5f, -0.5f);  
  100.         Vector3 v3 = new Vector3(-0.5f, 0.5f, 0.5f);  
  101.         Vector3 v4 = new Vector3(0.5f, 0.5f, 0.5f);  
  102.         vertices.Add(v1);  
  103.         vertices.Add(v2);  
  104.         vertices.Add(v3);  
  105.         vertices.Add(v4);  
  106.   
  107.         // 三角网格  
  108.         triangles.Add(0);  
  109.         triangles.Add(1);  
  110.         triangles.Add(2);  
  111.   
  112.         triangles.Add(1);  
  113.         triangles.Add(2);  
  114.         triangles.Add(3);  
  115.   
  116.         // 贴图UV  
  117.         uvs.Add(new Vector2(0.333f, 0));  
  118.         uvs.Add(new Vector2(0.666f, 0));  
  119.         uvs.Add(new Vector2(0.333f, 0.333f));  
  120.         uvs.Add(new Vector2(0.666f, 0.333f));  
  121.           
  122.         filter.mesh.Clear();  
  123.         filter.mesh.subMeshCount = 1;  
  124.         filter.mesh.vertices = vertices.ToArray();  
  125.         filter.mesh.SetTriangles(triangles.ToArray(), 0);  
  126.         filter.mesh.uv = uvs.ToArray();  
  127.         filter.mesh.RecalculateNormals();  
  128.     }  
  129. }  

渲染六个面后的效果:



或者这样:



当然单纯一个方块渲染6个面是没有办法提升性能的,我们需要做的是把方块的面选择性加载才能达到优化的效果。


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论