回顾一下上节课的DLSS,(这个再作业2里面进行体验。。。)
我们现在考虑多个三角形,我们该怎么办呢,按照一个常用的逻辑就是近的物体会遮挡后面的物体,也是符合逻辑的(用计算机思想来说)就是先绘制远处物体,然后再绘制近处(覆盖):画家算法
这个算法涉及到一个深度问题,是很难把握的eg:
三角形之间存在圣都重叠,画家算法直接铺盖。
深度缓存他来了。
我对每一个像素进行深度排序,我们记录像素深度,在生成图片的时候,同步生成任何一个像素的深度
因为我们看的是-z,z小的反而远。
现在我们简化一下,深度永远是正的,因此深度高的距离远,(z小),我们不看z现在,就探讨深度(距离)
先看深度缓存的示例:(左边实际,右边深度图)
现在看是怎么实现的,
拿一个像素来举例,一开始我们绘制的是地板,然后我们记录地板像素深度,现在加入该立方体,我现在有新的三角形加入,我们可以知道他们像素的深度,我们查看深度图对应像素,如果小于已有的深度,我们就更新。(可以当作一开始无限远)
实际例子R:无限大)
这里特别提一句,有很多弹幕都说如果相等情况怎么办,这个还是我以前说的,不过是你的算法的>和>=的区别罢了,再老师写的代码里面是>,也就是说相等不更新呗。图像也是如此
时间复杂度o(n),因为只需要遍历一遍所有的三角形n个,所以o(n),我们只是求了一个最小值,没有正真意义上的排序。
这里又会一个出现一个问题,深度相同的的地方如果先后顺序不同会导致绘图不同,但是我们是当作没有相同的像素深度的(怎么可能两个三角形再同一个地方),这里我们说到两个三角体交叉线怎么整(我们是默认不会出现),实际出现我决定可以进行叠加(一般交界处特别黑),我是按照实际情况来进行猜测的,老师说不必细究。
这里提出问题,透明物体怎么解决(深度不行,需要更好的处理方式,后期会涉及)
深度缓存暂时到这里
下一步就是开始着色了:对不同的物体使用不同的材质就是着色了,在同一个环境下,采用不同的材质才会导致差异,例如铁球和石膏求,大小形状一样,但是看起来显然是有差异的 ,这里涉及好漫反射等诸多光原来,特别来说我们再金属球之类的地方往往会有一个高光区域(直接光照)。那我们再看背面,按理应该是黑色的,但是因为桌面等地方的光反射,导致他亮了起来(间接光)
我们先定义一些参数,N法线,V观测方向,L光照方向(都是单位向量)color颜色,shininess表示有发亮材质有多亮(是物体表面,不是亮度):
再目前来说我们是不考虑阴影的
漫反射:
如果我们用一条条的线代表光的能量可以看出
光和物体表面的夹角越接近90度(直射),接收到的能量越多,亮度自然会越高(一单位面积为基础)。可以联想到太阳光和地球四季的联系,夏天温度高的决定性原因肯定是因为太阳光直射或者接近直射导致的。
我们再谈一下发光:(以点光源为例子)
显然,距离越远能量会越低。(能量守恒),你单次能量大小固定的,但是你球壳的表面积越来越大,所以单位面积的能量也是再降低的。
我们定义当前点能量为I,那r位置的能量就是I/(r^2)(理想);
但是接触表面的时候我们还会吸收一部分所以:
前一项是能量,后一项是cos夹角,可以当作力的分解
特别提一嘴,漫反射是朝向四面八方的所有严格来说,我们不管朝那个方向看物体应该都是一样的,这里没有很懂。如果物体不变,观测的点不变,光源不变,那么晚我们不论那个方向看物体的那个点,都应该是一样的这才是漫反射的特点
这里还有一个kd,可以看图,它可以很好的展示kd(就是一个漫反射系数)