GAMES101

变换

  1. 先缩放,再旋转最后平移
  2. 按照任意轴(起点过原点)进行旋转(最后一部分是叉乘的矩阵表示方式)
    在这里插入图片描述
  3. 经典的旋转矩阵不容易作插值运算,四元数的引入是为了更好做插值运算
  4. 正交投影、透视投影(n+f,-nf)

光栅化与抗锯齿

  1. 锯齿:采样信息不够,采样函数在时域的频率不够导致其在频域上复制被采样函数时在高频区域发生交叠出现错误
  2. 解决方法:提高采样频率、使用低通滤波(在时域上表现为卷积,即频域相乘相当于时域卷积)
  3. 时域上的卷积相当于高斯滤波,更近一步来说是需要算出每个三角形占据像素的区域百分比,方式是通过增加每个像素的采样点近似的计算所占的百分比(MSAA)
  4. 其他的抗锯齿方法
    FSAA(快速近似抗锯齿):先得到一张有锯齿的图,找到边界位置,将边界位置换成没有锯齿的边界,在图像层面进行抗锯齿
    TAA(时间抗锯齿):将当前帧的信息应用到下一帧中
  5. 超采样:DLSS(使用深度学习的方式进行超采样)

着色

  1. phong模型公式(优化:blinn-phong模型)
    在这里插入图片描述
  2. 着色频率:面、顶点、像素(着色工作量取决于图形需要进行的着色频率,当面的数量远远超过像素的数量,那么计算机处理起来flat shading就比pixel shading复杂)
    在这里插入图片描述
  3. 重心坐标插值(为了根据顶点信息得到每个像素对应的信息)
    在这里插入图片描述
    在这里插入图片描述
  4. 纹理本身的分辨率不足以匹配屏幕分辨率(屏幕上的很多像素都被映射到同一个纹理坐标上)会导致效果变差
    Nearest:会导致结果不连续
    Bilinear:双线性插值出来采样颜色
    Bicubic:这个方法与双线性插值类似,不同的是双线性插值只取周围四个像素进行处理,但是双三次插值采取周围的十六个像素进行处理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 纹理分辨率远远超过屏幕空间的分辨率(相邻像素采样纹理坐标间隔太远导致颜色突变)摩尔纹。当像素覆盖的纹理区域很大的时候, 再将纹理坐标中心对应的像素直接认为是这一个像素的颜色时,是有问题的。
    在这里插入图片描述
  6. 各项异性过滤:存放矩形区域,用于解决Mipmap只能覆盖正方形的区域,不能覆盖矩形区域的问题,但是对于倾斜的矩形区域仍然不能被很好解决
  7. EWA过滤(EWA filtering):使用椭圆来进行存放
  8. 纹理的应用:环境光贴图、凹凸贴图、纹理贴图
    在这里插入图片描述

几何

  1. 显示表示、隐式表示(SDF)
  2. SDF可以用于模拟场景中模型的融合
  3. 贝塞尔曲线、B样条曲线,曲面
  4. 曲面细分:Loop Subdivision(Loop细分)、Catmull-Clark Subdivision(General Mesh)(Catmull-Clark细分)
    在这里插入图片描述
  5. 曲面简化:边塌缩
  6. 阴影:bias,光源平面与物体平面夹脚越大,bias应该越大(正面剔除是另一种解决摩尔纹的问题,但也有很多限制),软阴影的生成

光线追踪

  • 使用光线追踪的原因:光栅化不能很好的解决全局问题(即物体与物体相互作用相互影响的问题,全局光照),也不能解决软阴影

  • 光线与平面求交:Möller Trumbore Algorithm(MT算法)
    在这里插入图片描述
    下面看这个公式,公式的左边是射线公式,右边是根据三角形的重心坐标求点。

  • 如果只是对每个三角形都求一次交点,那速度很慢,并且每一根光纤的每一次弹射都需要重新遍历场景中的所有三角形,很难做到,因此提出包围盒的概念。
    矩形包围盒(AABB)求交点
    在这里插入图片描述
    光线与横平竖直的面求交好求。只要当光线的某一分量等于某一个特定值的时候,就说明光线和这个轴对齐的平面有交点了
    在这里插入图片描述

  • 利用AABB加速结构提出的基于空间划分方式
    均匀网格划分:对网格的划分数量有要求,太多或者太少效果都不好,并且不适合物体在空间中分布不均匀的情况
    不均匀网格划分:Oct-Tree、KD-Tree(存在很多不足,比如很难判定一个三角形是否与框有交集,一个物体可能出现在多个盒子中)、BSP-Tree

  • 利用AABB加速结构提出的基于物体划分方式
    BVH是将物体两堆两堆地划分下去,每一次划分完成都需要计算其包围盒,不同包围盒可以相交。
    处理过程:

    • 找到一个包围盒
    • 递归地把一个包围盒拆成两个部分(通过把包围盒里的物体分成两个部分)
    • 把这两个新拆出来的两个部分重新计算他们的包围盒
    • 在必要的时候停下来(当节点包含很少的元素时停止)
    • 在每一个叶子节点中存储实际物体

    技巧:

    • 选择一个维度来划分
    • 技巧1:总是选择最长的轴来进行划分,让最长的轴变短,通过这种方式最后能变成一种比较均匀的状态。
    • 技巧2:选择中间的物体作为划分。这样可以让划分的两个部分包含的物体差不多相等。 所有的物体按照先后排列在要划分轴方向上,取这个序列的中位数为分界点来保证划分是均匀的,找中位数一般是不需要排序的,可以用快速选择算法在O(n)时间复杂度内完成。(快速选择:可在O(n)时间内完成找到第K大的数字)

辐射度量学

  1. Radiant Energy:是光源辐射出来的能量总量(Q),单位是焦耳(J)。
  2. Radiant Flux(power) : 是单位时间内光源辐射出的能量(单位时间内能量,功率),单位是瓦特(W)。
  3. 光源会辐射出的各种不同的能量,我们怎样定义他们(方向性的Radiant Intensity)
  4. 在任何一个物体表面,他会接收到多少能量(Irradiance)
  5. 光线在传播的过程中,他的能量用什么样的方法来定义(Radiance)
  6. Radiant Intensity
    在这里插入图片描述
  7. Irradiance(Intensity没有衰减,Irradiance才是衰减的量)
    在这里插入图片描述
  8. Radiance(辐射): 是指一个表面在每单位立体角、每单位投影面积上所发射(emitted)、反射(reflected)、透射(transmitted)或接收(received)的辐射通量(功率)。
  9. Bidirectional Reflectance Distribution Function(BRDF,双向反射分布函数):从某个方向进来并且反射到某个方向去的能量有多少。其实BRDF就是描述了光线和物体是如何作用的。正是由于BRDF的这种概念,决定了物体不同的材质到底是怎么一回事,也就是BRDF定义了不同的材质。
    在这里插入图片描述
  10. 更进一步考虑物体自发光,得到渲染方程,渲染方程实际上就是一个积分求解的问题
  11. 由于函数的表达式难以写出,需要使用蒙特卡洛方法近似的求解定积分
    在这里插入图片描述

路径追踪

  1. Whitted-Style(递归)光线追踪:①总在进行镜面反射/折射 ②当光线弹射到漫反射表面时停止弹射
  2. Whitted-Style(递归)光线追踪存在的问题,一方面如果glossy材质也认为是镜面反射,那是不对的;另一方面漫反射的材质上也会存在反射。
  3. Whitted-style ray tracing主要问题,主要来源于漫反射这一物理现象,光线遇到漫反射的物体,光线不应该停下来,所以漫反射材质的物体渲染效果不真实(glossy reflection),而且忽略了漫反射物体发出的光线,导致环境缺少其照射产生的效果(亮度和颜色)。但是渲染方程是正确的。
  4. 将渲染方程写成蒙特卡洛积分的形式
    在这里插入图片描述
    在这里插入图片描述
  5. 存在的问题
    光线数量爆炸:只有当采样数N=1时才不会发生爆炸,用 N=1 来做蒙特卡洛积分,这就叫做路径追踪。如果 N≠1 ,那就会出现光线数量爆炸,也叫做分布式光线追踪(Distributed Ray Tracing)。
    算法不断递归,没有终止条件:解决这个问题最粗糙的想法,限制递归的深度,即弹射次数,但是这样显然是不符合物理规律的,因为真实的光线在环境中是不断弹射的,而且上一节我们介绍过,限制弹射次数,就是舍弃了渲染方程泰勒级数展开的高次项,一定存在能量损失,最明显的表现就是弹射次数少,图片整体比较暗。显然,计算机是无法计算无数次弹射的。
  6. 解决算法递归没有终止条件的方式:俄罗斯轮盘赌
shade(p, wo)
	//随机选一个概率P_RR(范围为0~1)
	Manually specify a probability P_RR
	//随机在(0~1)范围内取一个值ksi
	Randomly select ksi in a uniform dist. in[0, 1]
	//如果ksi大于P_RR,就返回0,这种情况就认为这根光线没有存活下来,不应该往外打这根光线
	If (ksi > P_RR) return 0.0;

	Randomly choose ONE direction wi~pdf(w)
	Trace a ray r(p, wi)
	If ray r hit the light
		//前面的(1 / N)没了,因为N = 1,最后的结果还要除以生存概率
		Return L_i * f_r * consine / pdf(wi) / P_RR
	Else If ray r hit an object at q
		//最后的结果还要除以生存概率
		Return shade(q, -wi) * f_r * consine / pdf(wi) / P_RR

  1. 为了解决随机采样的情况下噪声特别大的问题,转换为对光源采样。
    在这里插入图片描述
shade(p, wo)
	# Contribution from the light source.
	//均匀地在光源上采样,可以知道pdf为1/A
	Uniformly sample the light at x' (pdf_light = 1 / A)
	//渲染方程在光源上积分
	L_dir = L_i * f_r * cos(seta) * cos(seta prime) / |x' - p|^2 / pdf_light

	# Contribution from other reflectors.
	L_indir = 0.0
	//在这里考虑是否还要往四面八方均匀地发射光线,如果通过俄罗斯轮盘赌测试,就发射出一条光线
	Test Russian Roulette with probability P_RR
	Uniformly sample the hemisphere toward wi (pdf_hemi = 1 / 2pi)
	//这里考虑的光照为间接光照
	Trace a ray r(p, wi)
	//如果往四面八方打出光线,光线打到了q点,必须确认它不是光源,才能把他的贡献加进来(这里只考虑光线打到物体的情况,因为之前光源对着色点的贡献已经算出来了)
	If ray r hit a non-emitting object at q
		L_indir = shade(q, -wi) * f_r * cos(seta) / pdf_hemi / P_RR
	
	Return L_dir + L_indir

  1. 还有一点,上面的算法没有考虑光源到着色点中间是否有遮挡物的情况。取着色点到光源位置的一根光线连线,判断中间是否有物体遮挡,没有就用上方算法直接计算,有的话则将直接光照贡献计为0。
    在这里插入图片描述
  2. 路径追踪问题无法解决点光源的场景渲染

材质和外观

  1. 材质等于BRDF(Material == BRDF) 材质就是BRDF,BRDF定义了光线与物体如何交互,从而不同的材质产生了不同的视觉效果
  2. 这个BRDF的取值范围是[0,1/pi],而不是[0,1]。
  3. 折射方向的计算
    在这里插入图片描述
  4. 不同介质之间反射率的方式,与入射光和法线的夹角有关系
    在这里插入图片描述
  5. 微表面材质:也就是近处看是几何,拉远了看是材质。
    在这里插入图片描述
    半程向量是单位化的光照方向和观察方向的向量和
    F:菲涅尔项,根据入射方向、半程向量得到反射比例。
    G: 几何项, 反射的过程中,有一部分的光被自身几何结构遮挡了,有多少比例的反射光没有被遮挡。多说一句:什么时候容易发生这种自投影(自遮挡)的现象?答:光几乎是平行着物体表面,打到这个物体表面上。
    D:法线分布函数,在所有的分布里,有多少比例的微平面的法线方向沿着半程向量。
    分母是复杂的变换来的,不过多解释。
  6. 各项同性材质:我们认为他的微表面并不存在一定的方向,或者说方向性很弱
  7. 各项异性材质:微表面有方向性,视觉上会有一定的朝向
    在这里插入图片描述
  8. BDRF的属性:非负、线性性质、可逆性、能量守恒
    在这里插入图片描述
  9. 由于物理上的结论是做了很多简化,导致之前所说的很多物理推导出来的模型在实际中并不准确,因此需要对BRDF进行测量,测量出来的才是真正准确的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值