IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 图形基础-绘制一个mesh -> 正文阅读

[游戏开发]图形基础-绘制一个mesh

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

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:58:07  更:2022-05-18 17:59:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:28:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码