目录
Lecture 03
1) 回顾渲染流程
首先是对第一节渲染流程从美术素描的角度回顾
2) 关联IDE
通过下面步骤将IDE关联为VS Code
3) Shader Code
我们先在Shader Forge中将Shader模板调成最简单的形式,便于我们学习Shader代码

a) 简单认识Shader Code
打开Shader Code,老师已经帮我们分类好了,我们需要编写修改的地方只有绿色框内的部分,绿色框部分也进行了分类,具体解释如下:
- Shader路径名
- 供美术调节的材质面板参数
- 输入结构,其中有一个float4类型的成员变量
- 输出结构,同样有一个float4类型的成员变量
- 作为顶点Shader的方法,返回值为VertexOutPut类型,这里的操作是将输入顶点变换到裁剪空间中再输出
- 作为像素Shader的方法,返回值为float4类型的COLOR,这里的操作是将一个float3类型的变量输出为片段的颜色
b) Hello World
c) Shader Code实现Lambert
- 输入结构中增加一个float4 / float3类型的成员变量normal获取模型法线信息
- 输出结构中增加一个float4 / float3类型的成员变量nDirWS放在TEXCOORD0的位置用于储存世界空间法线信息
- 顶点Shader中将法线变换到世界空间里
- 片段Shader中获取法线信息和光照信息(光照位置的齐次分量为0时表示光照为平行光,此时其他分量表示平行光的方向;齐次分量为1时表示点光源或聚光灯,其他分量表示光源的位置),二者做点积后,取大于零的部分作为颜色输出
与Shader Forge转换的代码对比,自己编写的代码更加优质可读

4) 节点组
老师这里用一个例子展示了常用的参数节点,还构造了fake light(伪造光),即在场景中不存在光照的情况下,用一个三维向量,一个颜色,一个强度值伪造出一个光照效果

5) 作业

Lecture 04
1) 作业点评
一组主要是右下角的小怪物突出,使用菲涅尔做出了边缘光的效果,可以通过取世界坐标法线的绿通道,即法线的Y方向,与菲涅尔效果相乘,得到只有朝上的部分有菲涅尔效果,这样会更加真实


三组左上粉红色的是进行了风格化,左下倒数第二个用了Matcap,右上角皮卡丘使用了双层材质,内层为SSS,外层为油漆,是比较常用的里外两层的Shader,右下角是作业的唯一正解SSS效果

2) 作业
a) HalfLambert
b) SSSLut
百度:SSS材质是 Sub-Surface-Scattering的简写,指的是光线在物体内部的色散而呈现的半透明效果,最常见的就是我们的皮肤、还有蜡烛。
SSS的色散效果一般是先出现在明暗部分的分界线处,再向外扩散开,这次作业的实现方法是:
- 修改RampTex,使其明暗分界线左侧偏红,右侧偏蓝,并且两者由下至上渐变,实现散射的效果(WrapMode同样为Clamp)
- 将HalfLambert作为U坐标,SSS强度作为V坐标去采样,完成作业

c) 批改

首先是第一部分,将一个强度可调节的颜色的三个通道分别取出和Lambert结果进行step计算,相当于对加给Lambert的颜色的三个通道分别进行遮罩,然后再合并输出
三个通道分别和Lambert进行step计算,若全为0,则输出黑色,若全为1,则输出白色,当只有某个通道为1 时,单独输出该颜色,这一步的实质是0和1的排列组合,这也是出现分层效果的原因
下面将刚刚得到的输出由0->1Remap到1->0(这一节点可以由1减去输入代替,消耗更少),这一步是进行了一个取反的操作,取反后我们就可以单独对暗部进行处理了
将取反结果与一个颜色相乘,相当于将该颜色作为暗部颜色
下面再对亮部颜色进行一个处理,并利用屏幕UV结合深度给亮部加上纹理,最后亮部和暗部颜色组合即可

下面一个作业:
首先从光照入手,一个突出点是使用Normal Direction与Light Direction和Half Direction进行点乘,后者是用于做高光,后面上课应该会说

下面这部分先取得UV坐标,将它与不同的数相乘进行缩放,再对同一个Texture进行采样,就可以得到两张不同的纹理,将这两个纹理相乘就得到了一个双层叠加的纹理,再将纹理与一个颜色进行插值
将上面得到的结果与Lambert进行Blend(Overlay),再四舍五入,并分别与一个亮部颜色和一个暗部颜色进行插值,这一部分主要是为亮部和暗部更换颜色

这一部分将上面提到的高光与纹理进行Blend,四舍五入后将上一部分的结果与一个颜色进行插值,这一部分的作用是更改高光的颜色

最后总览:
3) 预积分皮肤
