前言:在学习的过程中笔记是不可缺少的,匆匆看过一遍不记笔记和实操的话总会忘掉一些知识点或者是记的不牢固,所以我写了本系列文章,一方面是强迫自己认认真真的看完一章课程,另一方面记笔记加深一下自己的记忆以及思考。所以本系列文章是我学习过程中的笔记,思考,实操以及作业然后分享给大家,欢迎大佬们指正。//出处知乎@SakuraWhite
//对应课程7-9课
一、可见性
复杂的遮挡——如何在计算机显示
二、引入概念——深度缓存(Z-Buffer)
Z-Buffer算法
深度缓存,会对每一个像素进行排列,同时生成fram buffer和depth buffer贴图来记录和表达深度信息,近的显示黑色远的显示白色,深度缓存只求每一个像素距离的最小值
图解
三、着色(shading)——引入明暗或颜色的不同
最基础的着色模型(Blinn-Phong反射模型)
//庄懂老师课程的Blinn-Phong光照模型
1、自上到下——高光,漫反射,环境光照(间接光照)
//确定方向
//着色有局部性,不考虑阴影
2、漫反射
图形学中我们把一束光射入物体表面,然后均匀等能量向周围反射的过程称为漫反射
考虑光线射入物体表面的损失情况
当物体表面和光线垂直的时候,物体表面完全吸收光,当物体和光线成一定角度的时候光线就会发生损失,简单来说就是没有那么多的光线进入物体的表面,所以需要一个公式去定义这些得到光线的多少,用物体表面的法线反向和太阳光的夹角来定义的这一性质(光线会被接收多少)或者(有多少根光线被吸收)
以光源为中心,不停的往外画圈圈,并且每一个圈的总能量是相等的,但是以为越往外画的圈越大,圈上面的点的能量越少,这时候就需要去定义下光的强度,首先以光源为中心,以光源距离1CM的地方的强度为I,那么就可以用(i/r的平方)来表示强度,就定义了每根光线的强度
3、高光
确定了光线接受的数量,和光线的强度,还差颜色。用一个常数kd里面包含了RGB通道,通过rgb通道就可以储存颜色,然后定义的三个公式相乘就得到了lambert反射模型,这里MAX是为了限制角度不超过90度,和得出的值不为负数
//shader入门精要
kd——漫反射系数
phone反射模型是主要来模拟高光
高光产生的原因是因为镜面反射的光线和观察方向相互接近到一定的角度就会产生高光,也就是只需要用镜面反射和观察方向的夹角的来代替原来的夹角
这里的k一般是白色,因为高光是白色
在phone反射模型当中,去计算反射光和我们观察方向的夹角的计算量是很大的,所以blinn-phone就用了其他的方法去代替这一夹角
多出的指数
这里的函数在没有次方时候,函数的过度是十分缓慢的,对应要模拟的高光就会出现大面积的高光情况,不符合现实生活,为了改变这一情况,用次方来加巨这一效果,其他部分同理
//加剧的函数变化
直观的指数影响
Ks和p的影响
4、环境光
这里将环境假设成光是一个常数
很精确地计算环境光很复杂
5、着色模型(Blinn-Phong)
6、着色频率
自左到右(按面着色, 按点着色,按像素着色)
采样频率的方法没有好坏之分,需要根据具体的使用情况进行
确定顶点的法线,去定义一套算法来确定,就是对顶点相邻的三角面得到法线并求平均
归一化确保单位长度一致,并使用重心坐标求法线
7、纹理
纹理映射直观例子
三维模型上面的每一个点,都可以在对应的二维空间类找到对应的点
并且将每一个点的漫反射系数储存在这个图片上,每一次进行光照计算,就可以通过纹理映射找到对应的漫反射系数
美术流程中UV贴图
UV坐标范围(0,1)
tiled纹理 UV无缝衔接合成
8、引出问题——知道三角形顶点UV坐标,如何知道三角形内部一个点UV坐标?
第一幅图的贴图(纹理)的像素远小于屏幕的像素,这样就会出现多个像素现实同一种颜色,而出现这样的锯齿效果
需要进行一个算法来解决问题,双线性差值,是一种混合的方法
找到临近的四个点
lerp就是双线性插值的计算公式,就是确定四个点的颜色值,就会得到4个点混合的颜色值,这时候把这个颜色呈现到屏幕上,就会出现过度的效果,来解决贴图(纹理)过小,屏幕像素大,出现的锯齿问题
贴图的纹理像素过大,屏幕的纹理像素过小就会出现近处锯齿远处摩尔纹
屏幕上远近关系
原因是因为像素不匹配的问题,在远处贴图纹理像素过多,需要引入mipmap技术
mipmap技术将纹理不停的缩放原来的两倍,level 0表示原始的贴图,随着level的增加每四个像素合成一个像素,形成了八张贴图
表示不同等级的mipmap贴图,这个东西就是D
将屏幕上面的的4个像素点映射到uv坐标上,求两个点的距离,然后取最大值D
判定这里D的等级,现在得到的成像不够好,不同level之间的贴图过度会过于生硬
把相邻的两张贴图,在进行一次双线性插值(混合)来处理边缘过度的效果
mipmap贴图两层间并不连续
再对两层进行插值
两层就连续了
但mipmap却仍将远处模糊
只能查询一个方框内的点
使mipmap各向异性,不局限在一个方格内采样取值
贴图会在不同的方向得到不同程度的拉伸,通过这种方法来模拟远处的情况
当改变摄像机视角,实际显示的图形便是和原本形状不一样的,各向异性,就解决了这个问题
完美效果
9、重心坐标
求A点的重心坐标
求任意点的重心坐标
可以通过求重心坐标的方法,得到属性