作业7 微表面模型实现
由于作业八我不会写,所以这终于是Games101小作业最后一篇,后期还有可能会完成GAMES101一部分大作业。
这一部分基本上就是做阅读理解了,理解几个公式之后是较为简单的,我们可以认为菲涅尔项F和几何项G只是一个0到1的系数,而真正起决定性因素的是D项,D项需要满足在投影立体角下积分为1(可能是和概率密度有关的定义,这里留到Games202再理解),即$cos\theta * d\omega_h$下,而Cook-Torrance 模型的分母为给D项配平的系数。
公式最好参考learnOpengl,给出了最详细的描述。
下面先给出渲染的结果。

首先在编码过程中,遇到了https://blog.csdn.net/Xuuuuuuuuuuu/article/details/129001805中提到的黑色噪点的问题,按照这篇文章解决就可以,白色噪点反而没有遇到,我认为在能量合理,且不存在浮点精度(如$f_r$项的分母过小)的情况下,是不会出现白色噪点的。
作业7关于pdf和采样的理解
对蒙特卡洛采样有一定的疑惑,下面将介绍一些蒙特卡洛采样的概念。
对于随机变量X,我们有函数f(x)和其概率密度函数p(x),我们想要估计函数f(x)积分的值,通常来说我们想要知道蒙特卡洛采样结果$g(x)=\frac{1}{n}*\sum_{1}^{n}{\frac{f(x)}{p(x)}}$。
需要注意的是,蒙特卡洛方法要求对于任何f(x)存在的地方p(x)>0。
我们简单证明其期望相等
其中$E[\frac{f(x)}{p(x)}]=\int{\frac{f(x)}{p(x)}*p(x)}=\int{f(x)}$
我们通过上述方法就可以简单求到该函数的积分的期望。
作业5
作业5我们需要翻找代码找到u,v的含义,因为这个代码实际上并没有贴图,代码中有这样一行注释:
uv stores the u and v barycentric coordinates of the intersected point
因此,我们返回求得的重心坐标u,v即可。
作业6
这一次作业比较简单,我们主要是需要对新的框架调整我们对应代码的格式。
framebuffer[m++] = scene.castRay(ray,0);
inline Intersection Triangle::getIntersection(Ray ray)
{
Intersection inter;
if (dotProduct(ray.direction, normal) > 0)
return inter;
double u, v, t_tmp = 0;
Vector3f pvec = crossProduct(ray.direction, e2);
double det = dotProduct(e1, pvec);
if (fabs(det) < EPSILON)
return inter;
}
Intersection(){
happened=false;
coords=Vector3f();
normal=Vector3f();
distance= std::numeric_limits<double>::max();
obj =nullptr;
m=nullptr;
}
堆排序
堆排序的过程为
建堆 从最后一个非叶子节点(对于节点编号为0~n-1的树,最后一个非叶子节点为n/2-1),按照堆的定义调整堆(即选择当前这个节点两个儿子节点(i*2+1,i*2+2)中的最大值,然后交换当前节点和该最大值节点)