shader基础入门(1)

news2025/1/13 13:06:30

本文基于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 手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程之死锁

目录&#xff1a; 1.什么是死锁&#xff1f; 2.可重入与不可重入 3.发生死锁的三个典型情况 4.发生死锁的四个必要条件 5.如何破除死锁&#xff1f; 1.什么是死锁&#xff1f; 谈到死锁&#xff0c;程序猿们都心存忌惮&#xff0c;因为程序一旦出现死锁&#xff0c;就会导…

深度学习训练营之鸟类识别

深度学习训练营之鸟类识别原文链接环境介绍前置工作设置GPU导入数据并进行查找数据处理可视化数据配置数据集残差网络的介绍构建残差网络模型训练开始编译结果可视化训练样本和测试样本预测原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&am…

机器学习:如何解决类别不平衡问题

类别不平衡是一个常见问题&#xff0c;其中数据集中示例的分布是倾斜的或有偏差的。 1. 简介 类别不平衡是机器学习中的一个常见问题&#xff0c;尤其是在二元分类领域。当训练数据集的类分布不均时会发生这种情况&#xff0c;从而导致训练模型存在潜在偏差。不平衡分类问题的示…

【Unity云消散】理论基础:实现SDF的8SSEDT算法

距离元旦假期已经过去5天了&#xff08;从31号算起&#xff01;&#xff09;&#xff0c;接着开始学习&#xff01; 游戏中的很多渲染效果都离不开SDF&#xff0c;那么SDF究竟是什么呢&#xff1f;到底是个怎么样的技术&#xff1f;为什么能解决那么多问题&#xff1f; 1 SD…

git介绍及环境搭建

git介绍及环境搭建Git介绍Git安装流程配置用户信息git工作流程与常用命令问题点总结主要工作流程git工作流程与原理总结Git介绍 1.Git是什么&#xff1f; Git版本控制系统是一个分布式的系统,是用来保存工程源代码历史状态(游戏存档)的命令行工具 GIT是一个命令行工具,用于版…

基于Java+Spring+vue+element社区疫情服务平台设计和实现

基于JavaSpringvueelement社区疫情服务平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

Django+channels -> websocket

Django+channels -> websocket 学习视频: https://www.bilibili.com/video/BV1J44y1p7NX/?p=10 workon # 查看虚拟环境 mkvirtualenv web -p python3.10 # 创建虚拟环境 workon web # 进入虚拟环境pip insatll django channelsdjango-admin startproject ws_demo python …

【NI Multisim 14.0原理图环境设置——元器件库管理】

目录 序言 一、元器件库管理 &#x1f349;1.“元器件”工具栏 &#x1f34a;&#xff08;1&#xff09;电源/信号源库 &#x1f34a;&#xff08;2&#xff09;基本器件库 &#x1f34a;&#xff08;3&#xff09;二极管库 &#x1f34a;&#xff08;4&#xff09;晶体管…

seL4 背景知识

1 seL4 演变 1.1 微内核 微内核发展到目前为止经历了三代, 这里做一些归纳。参考《现代操作系统: 原理与实现》中操作系统结构一章, 关于微内核架构发展的介绍。 第一代微内核设计将许多内核态功能放到用户态, Mach 微内核是第一代微内核的代表。第二代微内核设计将对 IPC 优…

C++学习记录——일 C++入门(1)

C入门&#xff08;1&#xff09; 文章目录C入门&#xff08;1&#xff09;一、C关键字二、C第一个程序三、命名空间1、域作用限定符2、了解命名空间3、命名空间的使用四、C输入输出五、缺省参数六、函数重载七、引用1、引用符号2、引用的部分使用场景一、C关键字 关键字有98个&…

filebeat采集nginx日志

背景我们公司项目组用的是elastic的一整套技术栈&#xff0c;es&#xff0c;kibana&#xff0c;filebeat和apm&#xff0c;目前已经可以采集网关各个微服务的日志。架构图现在需要在原来的基础上把nginx这的日志也采集上来&#xff0c;方便做链路跟踪问题与思路原先traceId是在…

数字经济时代,“8K+”开拓行业新格局

2023深圳国际8K超高清视频产业发展大会召开&#xff0c;大会以“超清互联 数智创新”为主题&#xff0c;汇聚两院院士、产业领袖、领军企业共同深入探讨超高清产业发展现状、关键问题和未来趋势&#xff0c;并集中发布《深圳市超高清视频显示产业白皮书&#xff08;2023版&…

「数据密集型系统搭建」开卷篇|什么是数据密集型系统

在我们开发的诸多系统&#xff0c;基本都可以视为“数据密集型系统”&#xff0c;数据是一切物质的载体&#xff0c;我们依靠数据做存储记录&#xff0c;通过数据进行信息传递交换&#xff0c;最终还要数据来呈现和展示等&#xff0c;从一定视角而言&#xff0c;系统中最核心、…

临时用网搞不定?别着急,5G网络“急救车”来啦

如何在1天时间内&#xff0c;用不超过5名装维人员&#xff0c;完成超过200间宿舍的网络覆盖&#xff0c;让即将踏上考场的高三学子们尽快用上网络&#xff1f; 近期&#xff0c;这个问题一直困扰着重庆电信客户经理周睿。原来&#xff0c;由于疫情原因&#xff0c;重庆市某中学…

WINDOWS安装Oracle11.2.0.4

(一)Oracle服务器端安装 1.运行Oracle11g服务器端安装程序setup.exe,弹出如下界面&#xff1a; 2.如上界面中&#xff0c;把默认打上的勾去掉&#xff0c;然后点击【下一步】&#xff0c;弹出如下界面&#xff1a; 3.如上界面中&#xff0c;选择跳过软件更新,然后点击【下一步…

指针进阶(三)再谈数组与串函数

&#x1f31e;欢迎来到C语言的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f320;本阶段属于练气阶段&#xff0c;希望各位仙友顺利完成…

【阶段二】Python数据分析数据可视化工具使用01篇:数据可视化工具介绍、数据可视化工具安装、折线图与柱形图

本篇的思维导图: 数据可视化工具介绍 Matplotlib是最著名的绘图库,主要用于二维绘图,当然也可以进行简单的三维绘图。它提供了一整套丰富的命令,让我们可以非常快捷地用Python可视化数据,而且允许输出达到出版质量的多种图像格式。 Seaborn是在matplo…

国内电容市场份额达七成,松下如何抢占高地?

01 电容市场发展 电容器是三大电子被动元器件之一&#xff0c;是电子线路中不可缺少的基础元件&#xff0c;约占全部电子元件用量的40%&#xff0c;产值的66%。中国电容器行业规模增速持续高于全球规模增速&#xff0c;中国市场的快速增长成为拉动全球电容器行业规模增长的主要…

【Python从入门到进阶】2、Python环境的安装

接上篇《1、初识Python》 上一篇我们对Python这门编程语言进行了一个基本的了解&#xff0c;本篇我们来学习如何下载安装Python编程环境&#xff0c;以及如何使用pip管理Python包。 本篇讲解的是Windows环境下安装Python编程环境的步骤。 一、Python安装包下载 想要使用Pyth…

vue框架、element-ui组件库、font awesome图表库

一、vue 创建一个新vue项目。 vue create ProjectName 然后cd到该目录下&#xff0c;npm run serve启动服务器&#xff0c;即可打开。 二、组件库 element-ui是饿了么的&#xff0c;ArcoDesign是字节的&#xff0c;有很多。 install见官方文档&#xff1a;组件 | Element 导入…