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 ? ? ? ? } ? ? } } */
|