![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240123231818.png)
unity-shader-01
摘要:Struct、Vector、Dot、Mapping、渲染过程、lambert、Halflambert
结构(Struct) 向量(Vector 点乘(Dot) 屏幕映射(Screen Mapping)lambert Halflambert
了解:结构(Struct)
- Struct:一些相关数据的组织方式
打个比方:
可以把学生证理解为:相关学生信息的组织方式;
很显然,方便之处是: 进校门时不用出示多张姓名卡,学号卡,班号卡...,而只用出示一个信息集中的学生证.
渲染时发生了什么?
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130336.png)
模型信息》输入结构
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130423.png)
输入结构》顶点shader》输出结构
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130457.png)
输出结构》像素shader》渲染结果
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130525.png)
了解:向量(Vector)
- 标量(Scalar): 只有大小,没有方向的量,如: 年龄,体重等;
- 向量(Vector): 既有大小,也有方向的量,如: 力,速度等;
- 理论上不存在没有大小,只有方向的量;但存在大小无现实意义的量,我们多把它归一化处理。
了解:点乘(Dot)
- 点乘/点积/Dot: 两向量间的一种运算方式,结果为一标量具有良好的几何含义;
- 结果的几何意义为:一个向量在另一向量上的投影长度;
- 结果的图形学表现为:两向量,方向同时 结果=1(白色),方向反 结果=-1(黑色),垂直 结果=0(黑色);
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121173451.png)
lambert
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130616.png)
半lambert
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130639.png)
实战环节
在shaderforge新建无光照shader
运用上述所学,使用点乘实现lambert
我们可以在shaderforge 通过右键菜单-获取自己所需要的数据结构
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121180958.png)
获取点乘Dot
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121181618.png)
获取模型的法线方向-以及灯光的方向
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121181442.png)
然后我们就可以得到一个基础的光照模型,这里使用clamp 控制最大值和最小值在0~1 之间。这样就能把负数给清理掉,以及大于1的值。
lambert
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121184006.png)
Halflambert
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121190311.png)
clamp 节点
clamp 节点的解释-我们可以在shaderforge的官网文档中找到
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121194815.png)
了解:映射 (Mapping)
两个集合,元素间相对应的关系,可以理解为UV与贴图之间的关系。
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240127130720.png)
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121200729.png)
导致斑点问题的原因是由浮点精度造成的: 《Shader入门精要》158页,
解决方法:贴图的WrapMode从Repeat改成Clamp。
- Repeat模式会保留小数部分,例如:1.0001
- clamp模式会把小数部分给化为整数,例如:1
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121201109.png)
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240121201127.png)
课后作业
作业:
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240122004616.png)
实现节点:
通过直接绘制贴图和shaderforge内的描边接口实现
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240122225141.png)
![](https://megestus-1309556466.cos.ap-shanghai.myqcloud.com/img/20240122005042.png)