shader基础入门(1)

本文基于unity免费公开课“Hi Shader以及网络公开资料等书写”遵循开源协议。

MeshFilter网格过滤器

从海量资源中挑选适合的Mesh将他交给MeshRender

MeshRenderer 网格渲染器

负责把MeshFilter丢过来的Mesh,绘制显示到我们的场景中

Material 材质球

Material是MeshRenderer中非常重要的角色,它的配置决定了物体表面的外观将以怎样的质地呈现到我们眼前。

如果丢失就是我们常说的材质丢失,在unity中的模型将会呈现粉红色,材质或者shader出现问题你就能看到

为何是这个颜色?

RGB调成101就是这个颜色啦,这里是,美术三原色相关的知识,如果您需仔细了解可访问unity中文课堂 Hi shader(免费)了解详情

shader(着色器)设置不对也会造成这一问题。

Mesh网格

Mesh指的就是模型的网格,它决定了物体的表面形状是怎样的,一个模型的表面大多是由多个彼此相连的三角面构成,当然也有其它类型。

但一般都为三角形,我们模型绘制也遵循三角形的原理

mesh是构成整个模型或图形的信息集合,它就有这些三角形的大小以及排列组合是怎样的信息

---------------------

在 C# 中,Unity 使用 VertexAttribute 枚举描述可用的顶点属性。 可以使用 Mesh.HasVertexAttribute 函数检查 Mesh 类的实例是否具有给定的顶点属性。

顶点位置表示顶点在对象空间中的位置。

Unity 使用此值来确定网格的表面。

所有网格都需要此顶点属性。

在 Mesh 类中,访问此数据的最简单方法是使用 Mesh.GetVertices 和 Mesh.SetVertices。 Unity 还将此数据存储在 Mesh.vertices 中,但这个较旧的属性效率较低且用户友好。

Unity 将顶点切线和附加数据存储在一个四分量向量中。 向量的 x、y、z 分量描述切线,向量的 w 分量描述它的方向。 Unity 使用 w 值来计算副法线,它是切线和法线的叉积。

纹理坐标 (UV)
一个网格最多可以包含八组纹理坐标。 纹理坐标通常称为 UV,集合称为通道。

Unity 在网格周围“包裹”纹理时使用纹理坐标。 UV 指示纹理的哪一部分在顶点位置与网格表面对齐。

UV 通道通常将第一个通道称为“UV0”,将第二个通道称为“UV1”,依此类推直至“UV7”。 这些通道分别映射到着色器语义 TEXCOORD0、TEXCOORD1 等等,直到 TEXCOORD7。

默认情况下,Unity 使用第一个通道 (UV0) 来存储常规纹理的 UV,例如漫反射贴图和高光贴图。 Unity 可以使用第二个通道 (UV1) 存储烘焙的光照贴图 UV,使用第三个通道 (UV2) 存储实时光照贴图 UV 的输入数据。 有关光照贴图 UV 以及 Unity 如何使用这些通道的更多信息,请参阅光照贴图 UV。

所有八个纹理坐标属性都是可选的。

在 Mesh 类中,访问此数据的最简单方法是使用 Mesh.GetUVs 和 Mesh.SetUVs。 Unity 还将此数据存储在以下属性中:Mesh.uv、Mesh.uv2、Mesh.uv3 等等,直至 Mesh.uv8。 请注意,这些较旧的属性效率较低且用户友好。

Indices 索引数组 int[]

它是每个三角面顶点 的索引,可以理解为他存储了构网格三角面所用到的顶点索引。

Vertex data 顶点数据

它包含了顶点的位置、法线、切线、UV等属性

Normal 法线 Vector3[]

法线就是垂直于该顶点三角面的一条三维向量,它只有方向,没有大小。法线的方向就是顶点三角面朝外的方向。假设我们面前有一面镜子,它的正中心会有一条法线垂直于镜面指向我们,指向我们的面就是正面,相反就是背面

Tangent 切线 Vector3[]

它是垂直于法线的一条向量,而由于垂直于法线的向量有无数条,所以切线最终是由UV坐标来决定朝向的

UV 纹理坐标 Vector2[]

上面所说的UV坐标其实就是它,U增长的方向就是切线的方向,它和三维空间的X, Y, Z较为类似,它是一个二维的坐标系统,模型网格除了有三维空间的xyz坐标外,还有一个二维的UV坐标,在UV坐标中,U和V分别代表顶点在Texture水平和垂直方向上的采样坐标,这些坐标通常位于(0,0)和(1,1)之间,(0,0)代表最左下角,而(1,1)代表最右上角。这就跟平时装修房子贴墙纸一样,可以理解为它是Texture映射到模型表面的依据,模型顶点 会依据UV坐标对Texture进行采样。

Index data 索引数据

这个数据取决于拓扑类型,如果是三角面他储存的就是[0,1,2],四边形储存的就是[0,1,2,3],这个索引数值对应的就是顶点数组的下标。

---------------------------------到此官方资料结束-----------------------------

遵循坐标系进行渲染显示图形界面。由点连线,由线成面

 uv坐标是贴图三角形的比例坐标

这里贴图是二维的,故uv坐标的vector2数组

网格是分面贴不同的图,或是贴同一张图不同的地方

在unity中认为图片的大小是像素,单元格大小是米

uv坐标与图片像素成比例关系,0~1进行表示

------------------------------------------------------------

 我们可通过比例对图片进行裁切

uv坐标是贴图用,每个顶点一一对应

应用:

如果面多可使用list进行存储

List<Vector2> uv=new List<Vector2>();

然后设定四个点,一次设定一面

根据点来进行剪裁 

代码逻辑:

List<Vector2> uv= new List<Vector2>();//生成集合
 
 uv.Add(new Vector2(0, 0));//存储坐标信息
 uv.Add(new Vector2(0, 1));
 uv.Add(new Vector2(1, 0));
 uv.Add(new Vector2(1, 1));

 mesh.uv = uv.ToArray();//将他赋给图片进行显示

注意:这里必须进行赋值,否则图片无法显示

这里的数字是以比例映射到显示区域,以坐标0为起始,1为显示全部尺寸,0.3f为显示取得百分之三十,以此比例依次类推

-------------------------

vertices(顶点集合):

存储了顶点相关的信息,存储构成网格全部的顶点信息。

我也可手动进行设置

示例代码如下:

 List<Vector3> vectors= new List<Vector3>();

        vectors.Add(new Vector3(0,0,0)-Vector3.one*0.5f);
        vectors.Add(new Vector3(0, 1, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 0, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 1, 0) - Vector3.one * 0.5f);

        vectors.Add(new Vector3(1, 0, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 1, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 0, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 1, 1) - Vector3.one * 0.5f);

        vectors.Add(new Vector3(1, 0, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 1, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 0, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 1, 1) - Vector3.one * 0.5f);

        vectors.Add(new Vector3(0, 0, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 1, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 0, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 1, 0) - Vector3.one * 0.5f);

        vectors.Add(new Vector3(0, 1, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 1, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 1, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 1, 1) - Vector3.one * 0.5f);

        vectors.Add(new Vector3(0, 0, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(0, 0, 0) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 0, 1) - Vector3.one * 0.5f);
        vectors.Add(new Vector3(1, 0, 0) - Vector3.one * 0.5f);



        mesh.vertices= vectors.ToArray();

附加关于:mesh.triangles

三角形(triangles)

在mesh.vertices后需要设置三角形。一个四边形由两个三角形组成,每个三角形由先前创建的顶点数组中的三个点组成。要指定这些点,请将每个三角形定义为顶点数组的三个索引。

例如,此四边形的左下方三角形使用索引 0、2 和 1,对应于顶点数组中的坐标 (0, 0, 0)、(0, height, 0) 和 (width, 0, 0)。

顺序很重要,因为必须按顺时针对角进行排序。右上方的三角形使用索引 2、3 和 1。

int[] tris = new int[6]
{
    // 左下方三角形
    0, 2, 1,
    // 右上方三角形
    2, 3, 1
};
mesh.triangles = tris;

官方文档相关内容部分Example: creating a quad - Unity 手册

猜你喜欢

转载自blog.csdn.net/qq_46043095/article/details/128585154