个人学习笔记——庄懂的技术美术入门课(美术向)03
1 回顾渲染流程
老师以美术绘画的角度理解渲染管线,比较形象
不过在第一课的学习中,我已经补充了些理论,所以这一块就略过
2 尝试shader代码
首先是关联Unity里关联到VS,这部分也较简单,略去
以shader forge新建基础的shader来识别代码
可以看这里来稍微看看Unity的基础语义
仔细看看操作段,和我们之前在OpenGL里写shader很像
逐层来分析
- 操作段1和2的路径和材质参数暂且略过
- 第三段定义了一个输入结构,这个结构体有一个float4的变量 vertex,使用的是POSITION
- 第四段定义了一个输出结构,这个结构体有一个float4的变量 pos,使用的是SV_POSITION
- 第五段,我们声明了一个方法vert,这个方法以VertexInput的变量v为输入,输出的是VertexOutput
第一段把0强转成VertexOutput,赋值给变量o
o里的pos变量,采用v变换到到裁剪空间的坐标结果
然后返回o - 第六段,frag方法,对应输出的是COLOR这个参数
接受VertexOutput的结果,其内部设置了一个emissive的参数为颜色,然后输出
步骤知识改了下输出的颜色,比较简易
3 Lambert试试
- 这段实现Lambert的代码首先在输入阶段新增了一个NORMAL(float3就可以)
- 输出阶段声明一个变量在TEXCOORD0这个槽位,这个变量用来存储变化后的法线信息
- 顶点着色器里新增了把法线从切线空间转到世界空间
- 片段着色器里得到平行光的方向,发现信息,点乘以后取大于零的部分,返回颜色值
- nDirWS意为normal方向在worldspace
- 这里讲到unity存光照位置的时候是个齐次坐标,0代表向量,1代表点
- _WorldSpaceLightPos0.w为0,表示该光源为平行光。
_WorldSpaceLightPos0.w为1。则表示光源为点光源或聚光灯。
4 节点组
所谓fakelight,也就是自定义一个三维向量和颜色
5 作业
关于Lambert和HelloWorld代码都有了,半兰伯特也很简单,按照原本的连连看做法*0.5+0.5
关于作业,首先观察,发现是有颜色的,说明进行了UV的采样
但是亮部没有变化,暗部发生了颜色变化
目前我们在代码和光照模型上不会做大改动,所以不考虑该光照模型这一点
我又想到是不是单独判断暗部,给暗部成一个比例?
但是这样会有明显的分区感,不会连续变化,所以放弃这个数据是单独的一个乘数因子
- 回忆一下步骤:半Lambert→采样UV→输出
外围不可能的话,只有可能在UV或者采样上东西上做手脚
因为其他数据不可能变,所以slider改的是uv坐标,其中一个坐标给了Lambert,所以其改的是另一个坐标
根据作业改这个坐标有个效果,就是暗部变化,其他不变,由此推断这张材质图的样子
按照这个思路画了个图(虽然很丑(并且不知道怎么把渐变的意思很好表达出来Orz