基础光照
lambert(漫反射)
Phong(reflect(-r, n) dot v)
Bling-Phong(half-verctor dot n)
法线贴图
要获取法线贴图里的法线的信息, 需要先Unpack一下, 然后获得的是模型空间的法线, 再用TBN矩阵转换到世界空间, 这样就得到了世界空间的法线
然后将法线代入到 lambert, Phong, Bling-Phong就得到了相应的光照信息
CubeMap环境贴图
用于做反射效果, 环境光效果
详情见庄懂老师课程, 百人计划暂时没详细内容
调用Cubemaplod就会Unity就会自动生成mipmap(666!哇, 我才法线lod有这用处)
然后就可以通过mipmap来控制对应的粗糙度
具体步骤:
先获得反射值
reflect(-viewDir, normal)
, 再normalize
对采样的就是视角反方向关于法线镜像后的方向
得到worldRef向量
然后用worldRef位置信息, 去采样Cubemap
IBL(基于图像的光照)
也就是将一张图当作光源, 来加入它的高光计算里面
计算IBL的时候通常会用texlod来进行pbr里的粗糙度的表现
??? 不太懂, 等我看完learnOpenGL来补充
代码中的trick
金属质感 trick
当物体是金属的时候, 不太受到diffuse的影响, 想要还原纯金属的效果, 但是又想保留有非金属的质感, 这时候就需要和漫反射的颜色相关联
...
specular = lerp(diffuse * specular, specular, _Gloss/255);
...
环境反射的trick
同样也是用_Gloss/255去控制有没有受到漫反射影响
目的也是跟上面一样
...
reflect.rgb = lerp(reflcol * diffuse.rgb, reflcol, _Gloss/255);
...