公开课的一些笔记。
三种着色方式
flat shading: 三角形的顶点没有法向量,三角形整个面才有法向量,打光时整个三角形只呈现一种颜色。
Gouraud shading: 三角形的顶点都有各自的法向量,打光时三个顶点有各自的颜色,接着做双线性内插 (bilinear interpolation)来求得颜色,使整个三角形有渐层的颜色变化。
Phong shading: 三角形的顶点都有各自的法向量,先对三角形整个面作法向量的双线性内插,接着打光来求整个三角形的颜色。
示意图:
各自的复杂度:
flat shading的复杂度:N * L
Gouraud shading: 的复杂度:N * (3 * L + b * A)
Phong shading的复杂度:(B + L) * N * A
数学好的人很容易计算出复杂度:Flat<Gouraud<Phong Shading。这裡也因此说明了为何早期电脑都只支持Gouraud shading,就算已经知道Phong shading的效果比Gouraud shading好,但还是选择效能好而效果不错的Gouraud shading!如今GPU发展迅速,Phong Shading的效能已得到提升。
Screen-Door Transparency
透明的一种实现-透明纱窗。他用一个b比特纱窗覆盖在物体上面,bit为1就表示这个像素透明。然后在 shading 阶段将相邻像素根据透明度混合起来。
这个方法最大的优势就是不用考虑物体的顺序,当然,在一些系统中比alpha bending会快很多。
该方法在实现延迟渲染的初期就仔细调研过,它的优点是可以以统一的方式处理半透明和不透明。但缺点也同样比较致命:
如果以 4 个像素的方块作为一个混合单元,只能支持 3 层半透明。
如果光照环境和材质细节较复杂,特别是高光较强时,可以看出明显的颗粒感。且透明层数越多效果越差。
Alpha Blending
透明度用alpha表示,取值[0,1],1表示完全不透明,0表示完全透明。
颜色公式:
C=Cs*alpha+(1-alpha)*Cd
Cs表示透明板的颜色,Cd表示目标颜色。
Z-buffer
也叫深度缓冲。这是一项处理3D物体深度信息的技术,它对不同物体和同一物体不同部分的当前Z坐标进行纪录,在进行着色时,对那些在其他物体背后的结构进行消隐,使它们不被显示出来。Z Bufer所用的位数越高,则代表它能够提供的景深值就越精确。图形芯片大多支持24bit Z-Buffer而加上8bit的模板Buffer后合称为32bit Z-Buffer。
Painter algorithm
画家算法也叫作优先填充,它是三维计算机图形学中处理可见性问题的一种解决方法。当将三维场景投影到二维平面的时候,需要确定哪些多边形是可见的,哪些是不可见的。
“画家算法”表示头脑简单的画家首先绘制距离较远的场景,然后用绘制距离较近的场景覆盖较远的部分。画家算法首先将场景中的多边形根据深度进行排序,然后按照顺序进行描绘。这种方法通常会将不可见的部分覆盖,这样就可以解决可见性问题。
Depth peeling
层次分离技术。用于形状复杂的透明物体的绘制。示意图如下:
先画第一层,再画第二层...
层数越多,越逼真。
Depth peeling可能带来的问题:
1. 效率降低,且开销不稳定。(pass数量依赖于相机角度,骨骼动画等)
2. 方案本身带来的复杂性。(如何判断当前有多少层半透明,遮挡查询?)
3. 无已有的可参考的产品,只有技术demo。