admin管理员组

文章数量:829173

着色Shading(1)(光照、着色)(笔记)


文章目录

  • 前言
  • 一、可见性/遮挡(Visibility/Occlusion)
      • 画家算法(Painter's Algorithm)
      • 深度缓存(Z-Buffer)
      • 深度缓存算法的实际操作
      • 深度缓存算法的复杂度(Z-Buffer Complexity)
  • 二、Blinn-Phong反射模型(Blinn-Phong Reflectance Model)
      • 着色(Shading)的定义
      • Blinn-Phong反射模型(Blinn-Phong Reflectance Model)
      • 高光(Specular highlights),漫反射(Diffuse reflection)和环境光(Ambient lighting)
      • 着色的工作方式
  • 三、漫反射(Diffuse Reflection)
      • 漫反射是什么
      • 光的接收量
      • 光衰减
      • 漫反射公式
  • 课程的最后


前言

有关光照,着色和图形管线。


一、可见性/遮挡(Visibility/Occlusion)

画家算法(Painter’s Algorithm)


灵感来自于画家的绘画。由远到近绘画,这样在画新的近的物体时会覆盖掉原来远的东西。

画家算法需要需要通过深度(depth)对物体进行分类才能实现,所以可能造成无法解决的深度顺序。比如上图,由于物体之间存在互相遮挡的关系,所以无法定义深度,也就无法使用画家算法。

深度缓存(Z-Buffer)


保存每个像素的当前最小的z值(?),也就是这个像素在几何上能显示的最靠前的物体的深度信息。深度缓存算法需要保存一张深度图,也就是每个像素的深度信息。这样我们也就拥有了两个不同的缓存,一个是存储颜色值的帧缓存,另一个是存储深度值的深度缓存。
由于之前提到,我们的摄像机始终向着-z方向看,所以理论上z越大的物体离得越近。现在,为了简化概率,我们认为z始终是正的。

上图为深度缓存的示例。深度越小的颜色越深,越大的越浅。

深度缓存算法的实际操作


首先我们认为,所有像素的初始深度为无穷。

在光栅化阶段,对于任意一个三角形在光栅化之后覆盖的任意像素,如果这个新的三角形覆盖的某个像素的深度小于这个像素原本记录的深度,就将这个新三角形在这个像素的深度缓存值更新为这个像素的深度缓存值。当然一起更新的还有帧缓存的颜色信息。反过来,如果这个三角形覆盖当前像素的深度大于当前像素已经记录的深度,说明这个三角形在当前像素一定会被遮挡,就什么都不做。

上图为深度缓存算法图示。值得注意的是,当新的三角形覆盖当前像素的深度和当前像素之前记录的深度一样时,也什么都不做(算法是小于才做事)。

深度缓存算法的复杂度(Z-Buffer Complexity)


可以知道,对n个三角形做n*常数(三角形内的像素数)次操作,复杂度就是O(n)。为什么在线性时间内就完成了n个三角形的分类?其实我们并没有对三角形进行排序,只是记录了每个像素的最小深度,而不在乎每个三角形的遮挡关系(算法课)。
按照不同的顺序画三角形,不会对深度缓存算法产生影响。当然前提是没有出现两个三角形在同一个像素拥有同一个深度(合体了??)。上面所说的那种情况在现实中几乎不会出现,因为要求两个通过计算得到的浮点数完全相同。至于真的发生这种情况时该怎么做,不在本节课的讨论之中。

深度缓存是最重要的可见性算法(visibility algorithm),被应用在所有GPU硬件中。

二、Blinn-Phong反射模型(Blinn-Phong Reflectance Model)

着色(Shading)的定义


在本节课中,着色是指对一个物体应用不同材质的过程。

Blinn-Phong反射模型(Blinn-Phong Reflectance Model)

Blinn-Phong反射模型(Blinn-Phong Reflectance Model)是一个简单的着色模型。

高光(Specular highlights),漫反射(Diffuse reflection)和环境光(Ambient lighting)


通过对这个图片的感性观察,我们可以发现,图片中有高光部分(Specular highlights),也就是大量光线往一个方向(摄像机)反射的部分。漫反射部分(Diffuse reflection),也就是光线往四面八方反射(想想光线打到墙上)。环境光(Ambient lighting)部分,也就是接受从别的物体反射的光所产生的光照,也叫间接光照。

着色的工作方式


着色是一个局部的工作,光线从光照方向在着色点反射到摄像机。输入参数为:观察方向(Viewer direction, v),表面法向量(Surface normal, n),光照方向(Light direction, i),表面参数(Surface parameters, color, shininess, …)。

着色不等于阴影(shading ≠ shadow),着色不会生成任何阴影,着色是局部的,不考虑其他物体的存在。

三、漫反射(Diffuse Reflection)

漫反射是什么


漫反射就是光线在各个方向均匀地(uniformly)分散。

光的接收量


朗伯特氏余弦定律(Lambert’s cosine law),光照角度和获取能量(光线)的关系。总的来说,光照方向和法线方向的余弦和光照量成比例(正比)。

光衰减


光衰减,根据能量守恒,光在传播时范围越变越大,光强度在一点上也就越变越小。根据上图的公式可以得到到达着色点的光量。

漫反射公式


通过以上公式可以得到漫反射光,参数为到达着色点的能量大小,乘以着色点接收到的能量,max存在的意义是因为我们不考虑折射。乘以漫反射系数(diffuse coefficient),定义当前shading point的颜色。
由于漫反射能量是均匀的反射到各个方向上,意味着不论我们以何种角度观察一个点,看到的效果应该是一模一样的。这就是为什么我们没有考虑观察方向的影响。

上图展示了不同kb(漫反射系数)对应值的效果。从小到大。

课程的最后

还有两节课讲shading。

本文标签: 着色Shading(1)(光照着色)(笔记)