Games101 计算机图形学课程笔记: Lecture 07 Shading 1 (Illumination, Shading and Graphics Pipeline)

可见性/遮挡

画家算法

真实世界中的物体之间相对于相机是有远近关系的,画家算法可以在2D平面上反应物体的先后关系,即先画远处物体,再画近处的。

需要对物体进行排序,复杂度为O(nlogn),而且以下情况不好判断。

Z-Buffer

Z-Buffer不对物体排序,而对每个像素进行排序。

针对每个像素记录两个缓存值

  • 该像素对应的3D物体的最小的Z轴坐标值,即深度缓存(depth buffer),存储每个像素的深度信息
  • 对应的最近的3D物体的颜色值,即帧缓存(frame buffer),存储每个像素对应的颜色信息,即最终生成图片的颜色。

之前始终假设相机位于原点,且朝着Z轴负方向,所以离相机越近,Z轴坐标绝对值越小,反之越大。这里为了方便起见(仅讨论深度问题),所以假设Z值永远是正数,即Z越小,表示越近;反之越远。

下图右边就是深度缓存,越近值越小,颜色越深。

Z-Buffer算法:

for (each triangle T)
	for (each sample (x,y,z) in T)
		if (z < zbuffer[x,y]) // closest sample so far
			framebuffer[x,y] = rgb; // update color
			zbuffer[x,y] = z; // update depth
		else
			; // do nothing, this sample is occluded

在计算机里,深度值一般都是由浮点数表示的,所以理论上来说3D物体的深度值是不会相等的 。但是当对深度值做近似处理的时候,比如取整,这个时候两个像素的深度值就一样了,那这个时候颜色信息选哪个像素点的呢?(后面讨论)

Z-Buffer的复杂度是O(n),注意这里只是找到最小值即可,所以只需遍历所有像素点。

Shading 着色

先回顾以下前面的变换过程

  1. 模型变换(Model Transformation):先把机器人摆成要的某种pose,摄像机也放在真实世界某个位置。
  2. 视图变换 (View Transformation):把相机始终放在(0,0,0)位置,然后计算物体相对于相机的坐标位置。(其实相机拍的是机器人正面,为了方便理解才没有把机器人侧着画)
  3. 3D位置信息确定好了之后,需要做投影变换,即把3D映射到2D。
  4. 得到2D位置信息后做光栅化,即确定具体的像素位置。

在得到了帧缓存后,如果把每个颜色复制到像素上,得到的效果如左图,很不真实。还需要给物体着色才能得到右图的效果。

shading定义

Blinn-Phong Reflectance Model

模型主要组成

  • Specular highlights:镜面高光。即当光打在一个表面光滑的物体上时,就会产生镜面反射。
  • Diffuse reflection:漫反射。像墙这一类表面粗糙的物体,光打在它们身上是会朝四面八方反射。
  • Ambient lighting:环境光。人之所以看得见物体是因为物体把光反射到了我们的眼睛。那为什么能看到最下面的那个绿色杯子的背面呢?就是因为环境光的原因,简单理解就是,右上角的光源打在墙上,然后通过漫反射又把光打在了桌子和绿色杯子的背面,所以我们就看得见了。简单理解环境光就是二次光。

局部点着色

上图中的要素定义如下:

  • 观测方向:着色点到相机的方向,v。
  • 表面法向:着色点的法向量,n。
  • 光照方向:着色点到光源的方向,l。(七点是着色点,这是一种约定俗成的规定)
  • 表面参数:color,shininess等

下图给出了着色的一个示例图,可以看到物体的明暗都画出来了,但是因为前面提到的,光的方向被定义成从着色点到光源,所以一些应该有阴影的区域没有被画出来,所以我们需要把着色和阴影区分开来。

漫反射

漫反射理论上是指光达到某一点后朝着四面八方均匀的反射出去,如下图示。

Lamber’s cosine law 朗伯余弦定律

怎样判断物体表面光的亮度?

为了方便理解,假设光是离散分布的。左图,对于平放的物体,一共有6条光线打在上面。而物体旋转后(中间),此时该表面只接收了三条光线,所以该物体表面肯定要暗一些。仔细观察可以知道,物体表面的亮度应该与一个夹脚有关系,即法线n和光线l夹角, c o s θ = l ⋅ n cosθ=l·n cosθ=ln

也可以从另一个角度来理解上图:假设左图表面是一个边长为1的正方形,那么此时由于光线垂直该表面,所以单位面积接收到的能量是最多的,而旋转一定角度后,很显然单位面积接收到的光线能量就变小了,所以对应地,旋转后的表面的亮度就会暗一些。

光衰减

中心点是光源,假设光在传播过程中能量没有损失,也就是说以该光源为球心的整个球面都是一样的。
假设半径为r的球面的能量是E。由于假设光在传播过程总能量没有损失,所以r无论取什么值,其所对应的球面的能量都为E。
再具体分析某一个点,假设半径为1的球面上的某一个点的能量是I,那么就由 E = 4 π × 1 2 × I = 4 π I E=4π×1^2×I=4πI E=4π×12×I=4πI。同理,对于半径为r的球面上的某一个点,该点的能量应为 E / ( 4 π r 2 ) = I / r 2 E/(4πr^2)=I/r^2 E/(4πr2)=I/r2。由此可知,所有球面的能量虽然是相等的,但是每个点的能量确实不同的,具体来说是衰减的,这也叫做light falloff。

Lambertian (Diffuse) Shading

着色点的光亮计算公式:

  • k d k_d kd 指漫反射系数(diffuse coefficient),也叫Diffusivity,代表了颜色信息。物体之所以有颜色,是因为它吸收了部分光,反射了剩余的光。比如黑色就是把所有光的吸收了,没有光被反射,因此是黑色。又比光照在橘子上,橘子吸收了除橙色以外的光,因此最后橙色的光反射到人眼,所以橘子看起来就是橙色的了。很显然,吸收的光越多,那么能量就越大,不同能量也就对应了不同颜色的光,所以说这个系数也可以指代颜色。具体来说,如果kd是一个标量,那就应该表示明暗(黑白)程度,如果是一个三通道的向量,那么就可以表示具体的颜色了。 从微观角度看,再平直的表面都存在凹凸不平,因此就存在光向四周漫射的现象。向四周漫射的光通量与总的反射光通量之比称为:漫射系数或漫反射系数。这个与物体材质有关。
  • I / r 2 I/r^2 I/r2: 表示理论上每个着色点对应的光强度
  • m a x ( 0 , n ⋅ l ) max(0,n⋅l) max(0,nl):为什么要取最大值呢?因为前面提到了,单位面积接受到光的能量与 法向和光线夹角有关,一般认为如果夹角的绝对值大于90°时没有意义,就好像光线是从下方打过来的,此时该着色点被其他的点遮住了,故认为该点能量强度为0。

由此可知,物体表面的颜色或敏感程度与观测点位置无关,这与现实生活是相符的。比如你看月亮,它的表面亮度不会随着你的移动而发生改变,相反它只与太阳光的方向以及法线方向有关。

下图给出了光源处在不同位置时观测到的球面明暗程度的变化。以最右边那个为例,可以知道光源应该是左上方,照射到球面后,左上角球面的法向和光线方向夹角很小,所以看起来明亮一些;而随着夹角θ达到90°,甚至超过90°后,基本上就变成黑色了

原文地址:
https://www.cnblogs.com/marsggbo/p/12794115.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值