using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;public class AutoMesh : MonoBehaviour
 {
     //Mesh:是指模型的网格,Mesh的主要属性内容包括顶点坐标,法线,纹理坐标,三角形绘制序列等其他有用属性和功能。
     //      因此建网格,就是画三角形;画三角形就是定位三个点。
     //Mesh Filter:内包含一个Mesh组件,可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。
     //Mesh Render:是用于把网格渲染出来的组件。
     //             MeshFilter的作用就是把Mesh扔给MeshRender将模型或者说是几何体绘制显示出来。     /* 
         什么是纹理:(Texture)
                 纹理实际上是一个二维数组,它的元素是一些颜色值。
                 单个颜色值被称为 纹理元素 或 纹理像素。
                 每个纹理元素在纹理中都有一个唯一的地址。
                 这个地址由一个行和列组成,分别用U,V表示。        什么是纹理坐标
                 纹理中的每一个纹理像素可以通过它的坐标来声明。
                 对于所有纹理的所有纹理像素,Direct3D等软件要求一个统一的地址范围。
                 这个范围可以使0.0~1.0,包含0.0和1.0,用U,V标识。
                 纹理坐标位于纹理空间中,也就是说,它和纹理的(0,0)位置相对应。
         什么是展开UV
         展UV就是把建好的3D模型展开成平面2D图片,在平面上做材质,皮肤等,作用就是使模型的贴图效果更真实。
         一般的顺序都是先建模,再根据模型需要展UV贴图。
         举例说明:比如在一个球体的模型表面,贴上篮球的纹理,制作出一个篮球的模型。
         球体是3D的,贴图纹理是2D平面的,那么就需要将球体的表面展开分解为一个2D的平面,方便进行纹理贴图,这就是展UV     */
     // Start is called before the first frame update
     void Start()
     {
         GameObject  meshObj = new GameObject("new mesh");        Shader      shader = Shader.Find("Unlit/TextureShader"); // 自己创建一个shader
         Material    material = new Material(shader);
         material.mainTexture = InitTexture();                    // 设置图片        MeshRenderer meshRender = meshObj.AddComponent<MeshRenderer>();
         meshRender.material = material;        MeshFilter meshFilter = meshObj.AddComponent<MeshFilter>();
        Mesh mesh = new Mesh();
         InitMesh(mesh);
         //uv(显示纹理)
         Vector2[] uvs = InitUV(mesh);
         mesh.uv = uvs;
         //法线
         mesh.RecalculateNormals();
         meshFilter.mesh = mesh;
         //
     }
     //这里可以在runtime 是手动拖拽图片
     private Texture InitTexture() {
         Texture2D t = new Texture2D(100, 100);
         for (int w = 0; w < 100; w++)
         {
             for (int h = 0; h < 100; h++)
             {
                 if (h % 2 == 0)
                 {
                     t.SetPixel(w, h, Color.red);
                 }
                 else
                 {
                     t.SetPixel(w, h, Color.yellow);
                 }
             }
         }
         t.Apply();
         return t;
     }
     private Vector2[] InitUV(Mesh mesh)
     {
         Vector2[] uvs = new Vector2[mesh.vertices.Length];
         for (int i = 0; i < uvs.Length; i++)
         {
             uvs[i] = new Vector2(mesh.vertices[i].x, mesh.vertices[i].y);
         }
         return uvs;
     }    //绘制顶点
     private void InitMesh(Mesh mesh)
     {
         // 为网格创建顶点数组
         Vector3[] vertices = new Vector3[3]{
             new Vector3(0,0,0),
             new Vector3(1, 1, 0),
             new Vector3(0, 1, 0),        };
        mesh.vertices = vertices; 
        // 通过顶点为网格创建三角形
         int[] triangles = new int[]{
             2,1,0
         };        //triangles 网格面数据(即,组成它的三角形)只是每个三角形的三个顶点索引。 
         //例如,如果网格具有 10 个三角形,则 triangles 数组应是 30 个数字, 其中每个数字都指示要使用的顶点。
         //需要注意的是所绘制的三角形面片是有方向的,其方向与三个点成左手定则,
         //三角形的方向决定了只能这个方向观测时才会绘制三角形
         mesh.triangles = triangles;
     }
 } /*
 Shader "Unlit/TextureShader"
 {
     Properties
     {
         _MainTex ("Texture", 2D) = "white" {}
     }
     SubShader
     {
         Tags { "RenderType"="Opaque" }
         LOD 100        Pass
         {
             CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             // make fog work
             #pragma multi_compile_fog            #include "UnityCG.cginc"
            struct appdata
             {
                 float4 vertex : POSITION;   //顶点坐标
                 float2 uv : TEXCOORD0;      //UV 坐标
             };            struct v2f
             {
                 float2 uv : TEXCOORD0;
                 UNITY_FOG_COORDS(1)
                 float4 vertex : SV_POSITION;
             };            sampler2D _MainTex;
             float4 _MainTex_ST;
             //顶点着色器
             v2f vert (appdata v)
             {
                 v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                 UNITY_TRANSFER_FOG(o,o.vertex);
                 return o;
             }
             //片段着色器
             fixed4 frag (v2f i) : SV_Target
             {
                 // sample the texture
                 fixed4 col = tex2D(_MainTex, i.uv);
                 // apply fog
                 UNITY_APPLY_FOG(i.fogCoord, col);
                 return col;
             }
             ENDCG
         }
     }
 }
 */