**在计算机图形学中,对不同的物体应用不同的材质,叫做着色
1.光源方向I
2.法线方向n
3.观测方向v
4.亮度shaininess
1.光源方向和法线重叠时,物体表面接收到的光线最多,也最亮
2.物体表面倾斜时,法线和光源方向产生夹角,夹角越大,接收到的光线越少
1.任一时间内,光源发出的光都是处在一个球面上,随着时间的增大,球面半径增大,光或者说能量的总额不变,单位面积的能量在减少,具体关系为I/(r*r)
1.Ld是反射能量
2.kd是反射系数(小于1,因为会有一些被吸收)
3.I/(r*r)是到达shading point的能量
4.n和l两个单位向量的点乘得到夹角θ
5.max(0,nl)得到的是接收到的能量
6.之所以和0取最大值,是为了去除负值的情况.比如从下面入射的光线,没有物理意义,排除掉
1.当观测方向接近出射方向时,就能够看到高光
2.在blinn-phong模型中,简化为,当法线和光照方向与观察方向的半程向量足够接近时,就可以看到高光,半程向量即向量加法
3.ks是镜面反射系数
4.指数p用于增加衰减速度,作用是缩小高光的面积范围,如图2
5.ks和p的作用图例,如图3
先假设任何位置的环境光都是一样的入射量和接收量,因此是均匀的
1.环境光+漫反射+高光 = 布林冯反射模型
着色频率:
1.第一张是每个平面的法线做着色,叫做flat shading
2.第二张是每个顶点的法线做着色,然后平面通过差值来决定着色,叫做gouraud shading
3.第三张是每一个像素都做着色,叫做phong shading
1.当几何面细分越来越多的时候,着色效果和phong着色越来越接近
1.平面的法线可以由三角形的两个边通过向量叉乘获得
2.顶点的法线通过把周围的三角形的法线,根据面积进行加权平均得到
渲染管线,即渲染的流程:
1.第一步,输入空间中的点,投影到屏幕
2.第二步,点形成三角形
3.第三步,光栅化
4.第四步,像素着色
5.第五步,输出结果
6.可以分为三个部分,1.顶点处理,投影和变换,2.光栅化和深度测试,3.着色方案
7.在GPU中,很多步骤是可编程的,可以定义具体的方案
重心坐标是点的属性,不是三角形的属性
1.重心坐标定义在三角形所在平面,换一个三角形就是另一套定义
2.三角形ABC中任何一个点都可以表示成三个顶点的线性组合,其中A即(xa,ya),B,C同理,x=αxa+βxb+γxc,y同理
3.如果α β γ都是非负的,那么点就在三角形内 ,α+β+γ = 1就是为了限制这一点
顶点的A中心坐标就是(1,0,0)
1.重心坐标也可以通过面积比得到
2.三角形会被点分为三个三角形,其中Aa,Ab,Ac都是三角形
1.得到点V的重心坐标后,根据三个参数α β γ 再乘上三个顶点的各种属性,比如深度,颜色,纹理坐标,就能对这个点进行插值
2.最终目的是将三角形内的每个点都做插值,得到均匀过渡的三角形
3.空间中的三角形,同一个点投影前后的重心坐标可能是不一样的,因此插值要从空间中的三角形中计算,这一点可以保证深度是正确的
当使用纹理时,根据三角形顶点查到(u,v),再做插值
1.生成像素:pixel,纹理像素:texel,当生成的像素大于纹理的时候,多个像素会对应同一个纹理像素,就会产生锯齿
1.图中的黑点是纹理图,红点是对应的需要渲染的像素,显然渲染的像素数量大于纹理图,因此落在一个黑点格子内的红点都会取对应黑点的值,就会产生色块或者锯齿.
2.根据靠近纹理点的距离,得到一个比例x,根据x得到平均值
3.依据第一条,对周围4个点进行按比例的平均,得到一个过渡值,就可以优化放大产生的色块
1.在进度,一个像素覆盖的纹理区域很小,而在远处,一个像素覆盖了很大的纹理区域,这时候再做插值,得到的结果就会有很大问题
2.理解成信号概念,远处的像素覆盖过大的纹理区域,采样的频率就远远不够了
mipmap:对于一张图,可以生成另外几张图,分别是1/4,1/16,1/32,1/64等等,最后全部加起来,像素数是原来的4/3,也就是增加了1/3;
1.如图,左边是屏幕,红色点是pixel,红色点对应到纹理图上如右图所示
2.由此可求得两个点之间的距离L,如此就可以得到pixel对应在纹理上近似的占的范围
3.当L是1倍的pixel时,自然是从mipmap的第0层也就是原图上取,,当L是4倍的pixel的时候,我们知道应该对应mipmap的第1层,因此D=log2L
同样的,第1层和第0层有可能造成不均匀的过渡,因此,这里可以跨层插值,比如想要得到1.8层.就可以从第一层和第二层分别双线性插值,然后再做差值,叫做三线性插值
mipmap产生的过渡模糊问题
1.各向异性过滤相对于mipmap,增加了只压缩横向和只压缩竖直两种层级,存储量是原来的三倍