【GAMES101现代计算机图形学入门笔记】Lec07 着色 1(光照)

Lec07 着色 1(光照)

深度缓存(Z-buffer)

当多个物体重叠在一起时,如何体现远近关系呢?

还记得,我们在Lec04中暂时忽略了z坐标。这节课就要对z——深度进行处理。

画家算法

和画油画一样,先画远处的物体,再画近处的物体覆盖在其上。

缺点:先对物体排序(O(nlogn))再绘制;无法处理循环遮挡。

深度缓存算法

在画家算法中,每放上一个物体,都要对所有物体进行排序再绘制,还可能出现无法排序的状况。

而在深度缓存算法中,我们是对每个像素的最浅深度进行缓存。

  • frame buffer stores color values (buffer大小与屏幕大小一致)
  • depth buffer stores depth (buffer大小与屏幕大小一致)

(与Lec04不同,这里假设深度z恒大于0,即深度越小离我们越近,对应到颜色上也就是越黑:黑色000000,白色FFFFFF)

新放上一个物体时,对于屏幕上的每个像素,如果该点属于新物体的投影,那么极有可能深度就变了。如果比原来变得更小,那么就要更新该点的rgb值和深度值,反之则不做处理。

for (each triangle T)
	for (each sample (x,y,z) in T)
		if (z<zbuffer[x,y]) {
			framebuffer[x,y] = rgb; //更新颜色
			zbuffer[x,y] = z; //更新最浅深度
		}
		else
			;

时间复杂度:n个三角形,时间复杂度为O(n). 这里假设每个三角形覆盖常数个像素。我们无需排序;每次更新画面时,只需要记录、更新当前的深度缓存即可。

很显然,画面结果与物体的绘制顺序无关(只要不出现在同一像素深度相等的情况。事实上,浮点数是很难完全相等的)。

应用MSAA时,可能要对每个采样点进行深度缓存。

Z-Buffer is the most important visibility algorithm!

It is implemented in hardware for all GPUs.

着色(Shading)

即便是只有一种颜色的物体,在光照下不同部位也会呈现不同的颜色。着色就是让物体体现出光照下的明暗关系,其实也就是引入了不同的材质

注意!着色只考虑局部点的光照,与场景中其他点无关。因此不考虑全局光照、不产生阴影

布林-冯模型(Blinn-Phong Reflectance Model)

物体表面的光照效果可以分为三类:

  • 镜面高光(Specular highlights)
  • 漫反射(Diffuse reflection)
  • 间接/环境光照(Ambient lighting)

在分析这三类光照之前,我们先来做一些定义:

我们是在物体表面的某一点进行着色。定义观测方向、着色点法线、光照方向和物体表面参数。

要分析布林-冯光照模型,我们先从漫反射说起。

漫反射(Diffuse reflection)

所谓漫反射,就是在粗糙表面,光线射入后均匀地反射向所有方向:

为了得到着色点光的强度,我们考虑以下两件事:

第一,把光看作能量,可以知道光线与物体表面的夹角决定了多少能量能够被吸收。这也恰恰反映了为什么物体不同表面的明暗程度会有所差异——因为它们的角度不同。回想四季太阳直射图:

根据兰伯特余弦定理(Lambert’s cosine law),物体单位面积吸收的光能与光线与法线夹角的余弦成正比:

第二,我们还要计算着色点处的光线强度——这与距离发光点的远近有关。

考虑到光波是以球面的形式进行传播,上图每个球面对于同一光波在不同时刻的扩散状态。尽管球面大小不一样,但光波的能量是相同的。因此,球面上某一点的能量与球的表面积 4 π r 2 4\pi r^2 4πr2成反比。

综上所述(知道了有多少光传播到着色点 & 有多少光被吸收),我们就能够给出理想散射公式(Lambertian Diffuse Shading):

  • 在每个着色点,其颜色(散射参数)可能不同。如果把 k d k_d kd看作三通道的向量,就可以表示rgb颜色
  • 如果光线是从物体内部射出( n ⋅ l < 0 \bold{n}\cdot\bold{l}<0 nl<0),则视为没有物理意义。所以要取其和0的最大者
  • 散射是射向所有方向的,因此与观测方向 v \bold{v} v无关
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值