Unity Mesh、MeshFilter、MeshRenderer扫盲

一、Mesh 网格

Mesh概念:Mesh是Unity中的一个数据结构,称为网格。通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而多边形实际上是由多个三角形拼接而成的。所以一个3D模型的表面其实是由多个彼此相连的三角面构成。三维空间中,构成这些三角形的点和边的集合就是Mesh。

1. 顶点、法线、UV、顶点色

vertices:
normals:
uv:
tangents:
boneWeights :
colors/colors32:

//顶点位置数组
public Vector3[] vertices ;

//两种方法更改
//public void SetVertices (List<Vector3> inVertices);
mesh.SetVertices(vertices);
mesh.vertices = vertices;

//改变 vertices 后通常需要重新计算包围盒
mesh.RecalculateBounds();

//每一个顶点的法线方向
public Vector3[] normals ;

//uv列表
public Vector2[] uv ;

//网格的切线。
//切线最常用于凹凸贴图着色器中。切线是单位长度的矢量,它顺着网格 表面沿水平 (U) 纹理方向。Unity 中的切线表示为 Vector4, 其“x,y,z”分量定义矢量,而 w 用于在需要时翻转副法线。
//Unity 计算另一个表面矢量(副法线)的方法是获取法线与切线 之间的叉积,然后将结果乘以切线的 w。因此,w 应始终为 1 或 -1。
//如果计划在网格上使用凹凸贴图着色器,则应自己计算切线。 在分配 normals 或使用 RecalculateNormals 之后分配切线。
//注意:若要对 tangents 进行更改,从 Mesh 复制 切线十分重要。复制和更改 tangents 之后,normals 即可重新分配回 Mesh。
public Vector4[] tangents ;

//每个顶点的骨骼权重。
public BoneWeight[] boneWeights ;

//网格的顶点颜色。
//如果没有顶点颜色可用,则返回空数组。
public Color[] colors ;
//与 colors 相同,但是使用 Color32 结构的性能更好。
public Color32[] colors32 ;

2. 三角形triangles:

//该数组是三角形的列表,包含顶点数组的索引,长度必须始终是 3 的倍数。
//使用此属性分配三角形数组时,subMeshCount 设置为 1。如果要具有多个子网格,请使用 SetTriangles。
public int[] triangles ;

public void SetTriangles (int[] triangles, int submesh, bool calculateBounds= true, int baseVertex= 0);
public void SetTriangles (int[] triangles, int submesh);
public void SetTriangles (List<int> triangles, int submesh, bool calculateBounds= true, int baseVertex= 0);
public void SetTriangles (List<int> triangles, int submesh);

public int[] GetTriangles (int submesh);
public int[] GetTriangles (int submesh, bool applyBaseVertex= true);
public void GetTriangles (List<int> triangles, int submesh, bool applyBaseVertex= true);
public void GetTriangles (List<int> triangles, int submesh);

//决定索引的布局为三角形、四边形等
public MeshTopology GetTopology (int submesh);

//* SetIndices 、GetIndices 、GetIndexStart 、GetIndexCount
//* 子网格的 GetIndices 方法得到索引列表,始终是在 mesh.vertices 中截取的范围,范围的起始索引为 GetIndexStart ,数量为 GetIndexCount。
//* 只能通过 SetIndices 来指定截取的范围。
//* 当为 MeshTopology(网格拓扑) 为 MeshTopology.Triangles(三角形) 时, GetIndices 与 GetTriangles 得到的结果是一致的
public void SetIndices (int[] indices, MeshTopology topology, int submesh, bool calculateBounds);
public void SetIndices (int[] indices, MeshTopology topology, int submesh);
public void SetIndices (int[] indices, MeshTopology topology, int submesh, bool calculateBounds= true, int baseVertex= 0);

public void GetIndices (List<int> indices, int submesh);
public int[] GetIndices (int submesh)

public uint GetIndexStart (int submesh);
public uint GetIndexCount (int submesh);

二、MeshFilter 网格过滤器

MeshFilter: 译作 网格过滤器,记载着物体对应的所有Mesh的引用,当渲染GameObject时,通过MeshFilter获取其对应的Mesh。

MeshFilter是一个从Unity老版本留存下来的叫法,实际上它并不过滤任何东西,如果换一个更准确的名字:MeshRefference 可能更好理解。

三、MeshRenderer 网格渲染器

用来渲染Mesh的组件。

在这里插入图片描述

Materials

Materials:材质
Size:材质数量

Lighting

网格渲染器与Unity中的照明进行交互的属性

1)Cat Shadows:投射阴影。有四种模式
1、off:没用投射阴影
2、on:有投射阴影
3、Two Sided:可以从网格的任意一面投射出阴影。适用于半封闭物体
4、Shadows Only:只显示阴影,不显示网格

2)Receive Shadows:这个物体是否接收阴影

3)Contribute Global Illumination:选中此复选框可在游戏对象的 Static Editor Flags 中启用 Contribute GI。取消选中此复选框可在游戏对象的 Static Editor Flags 中禁用 Contribute GI。勾选后,才可以编辑以下内容。

3)Receive Global Illumination :设置此渲染器是从光照贴图还是从光照探针接收全局光照。
Lightmaps:此渲染器从光照贴图接收全局光照。
Light probes:光照探针|此渲染器从光照探针接收全局光照。

5)Prioritize illumination:启用此属性表示在实时全局光照 (Realtime Global Illumination) 计算中始终包含这个游戏对象。这很适合用于影响远离发光游戏对象的游戏对象,而发光游戏对象出于性能原因通常不会受到影响。
仅当在游戏对象的 Static Editor Flags 中启用了 Contribute GI__,项目使用内置渲染管线 (Built-in Render Pipeline),并且在场景中启用了 Realtime Global Illumination(已弃用)时,此属性才可见。

Lightmapping

在这里插入图片描述

仅当 Receive Global Illumination 设置为 Lightmaps 时,此部分才可见。

1)Scale in Lightmap: 指定游戏对象的 UV 在光照贴图中的相对大小。值为 0 会使游戏对象不进行光照贴图,但仍然有助于为场景中的其他游戏对象提供光照。大于 1.0 的值会增加用于此游戏对象的像素数(光照贴图分辨率),而小于 1.0 的值会减小该像素数。

您可以使用此属性来优化光照贴图,从而更精确地为重要和高度细节化的区域提供光照。例如:一幢具有平坦黑暗墙壁的隔离建筑物将使用低光照贴图比例(小于 1.0),而一组靠近在一起显示的彩色摩托车则需要高比例值。

2)Lightmap Parameters:为此游戏对象选择或创建光照贴图参数资源。
Scene Default Parameters:场景默认参数
Default-HightResolution:默认的高分辨率
Default-LowResolution:默认的低分辨率
Default-Medium:默认的中分辨率
Default-VeryLowResolution:默认的非常低分辨率
Create New…:创建新的自定义

3)Optimize Realtime UVs :指定创作的网格 UV 是否针对实时全局光照 (Realtime Global Illumination) 进行优化。启用此属性后,Unity 会对创作的 UV 进行合并、缩放和打包以实现优化。

禁用此属性后,Unity 会对创作的 UV 进行缩放和打包,但不会合并。
优化机制有时会在原始 UV 贴图中产生关于不连续性的错误。例如,有意锐利的边缘可能被误解为连续表面。

Max Distance:指定用于简化 UV 图表的最大世界空间距离。如果图表在此距离之内,则 Unity 会简化图表。
Max Angle:指定共享 UV 边缘的面之间的最大角度(以度为单位)。如果面之间的角度小于此值,则 Unity 将简化 UV 图表。

4)Ignore Normals:忽略法线,启用此选项可防止 Unity 在实时全局光照的预计算过程中拆分 UV 图表。

5)Min Chart Size:指定用于 UV 图表的最小纹理像素大小。如果需要拼接,则值 4 将创建一个 4x4 纹理像素的图表来存储光照和方向性。如果不需要拼接,则值 2 将降低纹理像素密度并提供更好的光照构建时间和游戏性能。

6)Realtime/Baked Lightmap:烘焙光照数据(菜单:Window > Rendering > Lighting Settings > Generate Lighting)后,此部分还将显示这个渲染器在场景中使用的光照贴图。在此处可以查看有关烘焙光照贴图 (Baked Lightmap) 和实时光照贴图 (Realtime Lightmap) 的相关信息(如果适用)。

Probes

部分包含与光照探针 (Light Probes) 和反射探针 (Reflection Probes) 有关的属性。
仅当 Receive Global Illumination 设置为 Light probes 时,此部分才可设置。

1)Light Probes : 设置此渲染器如何从光照探针系统接收光照。
有关更多信息,请参阅光照探针。

        Off        渲染器不使用任何插值光照探针。
        Blend Probes            渲染器使用一个插值光照探针。这是默认值。
        Use Proxy Volume    渲染器使用插值光照探针的 3D 网格。
        Custom Provided      渲染器从 MaterialPropertyBlock 提取光照探针着色器 uniform 值。

2)Proxy Volume Override: 设置对另一个具有 Light Probe Proxy Volume 组件的游戏对象的引用。仅当 Light Probes 设置为 Use Proxy Volume 时,此属性才可见。

3)Reflection Probes:设置渲染器如何从反射探针系统接收反射。

    Off        禁用反射探针。Unity 将天空盒用于反射。

    Blend Probes        启用反射探针。混合仅在反射探针之间发生。在室内环境中,如果角色可能在具有不同光照设置的区域之间过渡,此设置会很有用。

    Blend Probes and Skybox        启用反射探针。混合发生在反射探针之间或反射探针与默认反射之间。这对于室外环境很有用。

    Simple        启用反射探针,但存在两个重叠的探针体积时,反射探针之间不会发生混合。

4)Anchor Override:网格锚点。当使用光探针或反射探针时,用来决定插值位置。如果两个网格都根据它们自身的边界盒被单独照亮,那么光照在它们的连接点将会不连续。这里可以通过使用相同的Transform来作为两个Mesh Renderers的插值点,来避免这个问题

Additional Settings

1)Motion Vectors 设置是否使用运动矢量来跟踪此渲染器从一帧到下一帧的每像素屏幕空间运动。使用此信息可以应用后期处理效果,例如运动模糊。请注意,并非所有平台都支持运动矢量。请参阅 SystemInfo.supportsMotionVectors 以了解更多信息。

    Camera Motion Only        仅使用摄像机移动来跟踪运动。

    Per Object Motion            使用特定通道来跟踪此渲染器的运动。

    Force No Motion              不跟踪运动。

2)Dynamic Occlusion:启用 Dynamic Occlusion 后,线渲染器在摄像机的视图中被静态渲染器 (Static Occluder) 阻挡时,Unity 会剔除线渲染器。默认情况下启用 Dynamic Occlusion。

禁用 Dynamic Occlusion 后,线渲染器在摄像机的视图中被静态渲染器 (Static Occluder) 阻挡时,Unity 不剔除线渲染器。禁用 Dynamic Occlusion 可以实现诸如在墙后绘制角色轮廓之类的效果。

参考文章:
https://www.cnblogs.com/kingBook/p/13496389.html
https://blog.csdn.net/bingliangdeai/article/details/108640579
https://www.baidu.com/link?url=OEd4bGHR3goYezS702eGVxyLO9BzFDK4wVrSy5soT9BItmdNvM2o8FDPhd-Ryk6yNIg29YnKjaOJpMPCw6dhv_&wd=&eqid=b02203c900029b620000000462e9fa63

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你解答。 在Unity中,Mesh用于表示3D模型的几何信息,而MeshRendererMeshFilter组件则用于将Mesh渲染到屏幕上。如果你想构建一个baseMesh脚本,可以按照以下步骤进行: 1. 创建一个空物体,并给它添加一个MeshFilter组件和一个MeshRenderer组件。 2. 在脚本中,你需要定义一个Mesh实例,并使用MeshFilter组件的sharedMesh属性来获取当前物体的Mesh。 3. 接下来,你可以使用Mesh的各种方法来修改Mesh的几何信息,例如设置顶点位置、UV坐标、法线等等。 4. 修改完Mesh信息后,调用MeshFilter组件的mesh属性来更新当前物体的Mesh。 5. 最后,你可以使用MeshRenderer组件来设置物体的材质和渲染模式等等。 下面是一个简单的示例代码: ```csharp using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class BaseMesh : MonoBehaviour { private Mesh baseMesh; private void Awake() { baseMesh = GetComponent<MeshFilter>().sharedMesh; } private void Start() { // 修改Mesh信息 Vector3[] vertices = new Vector3[4] { new Vector3(-1, -1, 0), new Vector3(1, -1, 0), new Vector3(-1, 1, 0), new Vector3(1, 1, 0) }; baseMesh.vertices = vertices; int[] triangles = new int[6] { 0, 2, 1, 2, 3, 1 }; baseMesh.triangles = triangles; // 更新Mesh GetComponent<MeshFilter>().mesh = baseMesh; // 设置材质和渲染模式等等 GetComponent<MeshRenderer>().material = new Material(Shader.Find("Standard")); GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On; } } ``` 希望这可以帮助你构建自己的baseMesh脚本,如果你还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值