01.结构Struct
一些相关数据的组织方式
![](https://i-blog.csdnimg.cn/blog_migrate/a46faeb557c95d3f8e74e6d200b50e3d.png)
02.渲染过程
模型 > 输入结构 > 顶点Shader > 输出结构 > 像素Shader > 渲染结果
![](https://i-blog.csdnimg.cn/blog_migrate/2565d9a9d19787839961fbcdd2bc76b7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b7dd52e9d71a3c75c141c87d2c278bf.png)
将模型每个顶点位置信息,换算为每个顶点应该屏幕的位置
计算和赋值其他顶点信息,如: UV,顶点色,顶点法线
![](https://i-blog.csdnimg.cn/blog_migrate/125c60a257ddd03f73448b930729116f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/68fbc856dbd450deea65d158e85fcb13.png)
03.
向量
标量(Scalar):只有大小,没有方向的量;如:年龄,体重,等;
向量(Vector):既有大小,也有方向的量;如:力,速度等
理论上不存在没有大小,只有方向的量;但存在大小无现实意义的量,我们多把它归一化处理.
![](https://i-blog.csdnimg.cn/blog_migrate/7f941c3337c65134187bfe842801f05b.png)
04.点乘Dot
点乘/点积/Dot:两向量间的一种运算方式,结果为一标量.,具有良好的几何含义;
结果的几何意义为:一个向量在另一向量上的投影长度
结果的图形学表现为:两向量,方向同时 结果=1(白色),方向 结果=-1(黑色),垂直 结果=0(黑色)
![](https://i-blog.csdnimg.cn/blog_migrate/e7ec2d59be3471a39cbac2637bc50305.png)
两个向量方向
一样,它的投影长度
最长
![](https://i-blog.csdnimg.cn/blog_migrate/3d5a277c146ea32f7b75c2d7fde0140c.png)
两个向量方向
相反,它的投影长度为
负值
![](https://i-blog.csdnimg.cn/blog_migrate/db72c90aae74a671046a8aa5e46bc123.png)
两个向量方向
垂直,它的投影长度为
零
中午12点钟的太阳照到头上,投影就在脚下,值为0
![](https://i-blog.csdnimg.cn/blog_migrate/016873e95558ddbe8637cbb6790f7d4c.png)
如果一个向量是光的方向,
光的方向的反方向,
一个是物体表面的朝向
05.兰伯特光照模型Lambert
根据向量点乘的图形学含义,我们令:
-模型表面的垂直方向为向量nDir(即:法线方向)
-令光照方向的反方向为向量lDir(即:LightDir)
-令nDir * lDir(两者点乘)结果为像素输出;
最两处:值为1,纯白;
明暗交接处:值为0,纯黑;
暗部:值为负数,亦为黑;
负数是个意义的亮度,所以我们通常把结果为负数的值,都改为0;
则有:
Max(0,nDir * lDir)
即为
兰伯特光照模型
![](https://i-blog.csdnimg.cn/blog_migrate/ee246a7d103a26c451d4d9bba756be32.png)
Max(x,y)
选择x和y中的最大的
![](https://i-blog.csdnimg.cn/blog_migrate/b8b3c2719337ad9f3d1dd8607f8314d9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/18a89e3f86c5702708403e21e8a5c92a.png)
06.半兰博特光照模型 Half-Lambert
优点:比Lambert透气,不至于暗部死黑
缺点:显然和素描老师教的不一样
![](https://i-blog.csdnimg.cn/blog_migrate/313c74584b8f495a1adc29a122a20b99.png)
lDir 即平行光 Direction Light取方向光的
反方向
![](https://i-blog.csdnimg.cn/blog_migrate/038f299c325a578108ab5d3310aad99b.png)
Clamp 0-1
输出不小于0,不大于1 限制两端点之间的范围
![](https://i-blog.csdnimg.cn/blog_migrate/63fddd99290f8d9ad603f773dd42878b.png)
Clamp
将指定值限制在指定的最小和最大范围内
![](https://i-blog.csdnimg.cn/blog_migrate/d47aea19f9dbdfc1d4c467f13aec65ee.png)
![](https://i-blog.csdnimg.cn/blog_migrate/672f28b6f0385c96a3c7ddb46acfac2d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d51df86aa83652cda53ce3a4f1511dd8.png)
07.映射
映射:两个集合,元素间相互对应的关系
![](https://i-blog.csdnimg.cn/blog_migrate/084605222a728584523c18499f85a1af.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b36e54d6f264cda107a5a86792bb8aff.png)
08.调子映射 RampTex
![](https://i-blog.csdnimg.cn/blog_migrate/b1c91130898a3e96e53156e9da9fe2c5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b9e0aaf4be346b1c71e38306d742ed3c.png)
Append
把两个标量值合并成一个二维向量
一维向量+一维向量 = 二维向量
二维向量 + 一个标量 = 三维向量,限制最多四维
![](https://i-blog.csdnimg.cn/blog_migrate/b903e992ca3f183638308b43a13c0ff4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d389a1ce3c1f445906b7d7b1f39b5df0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4b321c3c9f72f749154456222d34bdc3.png)
结论
两个向量的方向越接近,它的点乘Dot结果越接近1
![](https://i-blog.csdnimg.cn/blog_migrate/d5f5501cd95cfdc5cfcd599b22557b63.png)
两个向量的方向越相反,它的点乘Dot结果越接近-1
![](https://i-blog.csdnimg.cn/blog_migrate/b809b809a11b0b6be0dfbe3b648f61ea.png)
两个向量的夹角为90度,它的点乘Dot结果为0
![](https://i-blog.csdnimg.cn/blog_migrate/c7c7f0395114e1372565e267b717fec1.png)
光 直射到表面 就应该 亮
光 背向表面 就应该 暗
光 垂直于90度 应该也暗
Append 是相加分量的节点
Component Mask 是拆分量的节点
![](https://i-blog.csdnimg.cn/blog_migrate/ede2ec87715a4b8b7baa20541c671ace.png)
![](https://i-blog.csdnimg.cn/blog_migrate/03f3642ec3e06b7bd8f36353988ee881.png)