Kagamine Len
文章20
标签10
分类2
作业7 微表面模型实现

作业7 微表面模型实现

由于作业八我不会写,所以这终于是Games101小作业最后一篇,后期还有可能会完成GAMES101一部分大作业。

这一部分基本上就是做阅读理解了,理解几个公式之后是较为简单的,我们可以认为菲涅尔项F和几何项G只是一个0到1的系数,而真正起决定性因素的是D项,D项需要满足在投影立体角下积分为1(可能是和概率密度有关的定义,这里留到Games202再理解),即$cos\theta * d\omega_h$下,而Cook-Torrance 模型的分母为给D项配平的系数。

公式最好参考learnOpengl,给出了最详细的描述。

下面先给出渲染的结果。

binary

首先在编码过程中,遇到了https://blog.csdn.net/Xuuuuuuuuuuu/article/details/129001805中提到的黑色噪点的问题,按照这篇文章解决就可以,白色噪点反而没有遇到,我认为在能量合理,且不存在浮点精度(如$f_r$项的分母过小)的情况下,是不会出现白色噪点的。

作业7 部分问题 加分部分-多线程

作业7 部分问题 加分部分-多线程

作业7关于pdf和采样的理解

作业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

作业5我们需要翻找代码找到u,v的含义,因为这个代码实际上并没有贴图,代码中有这样一行注释:

uv stores the u and v barycentric coordinates of the intersected point

因此,我们返回求得的重心坐标u,v即可。

作业3的相关问题

作业3的相关问题

作业6

作业6

这一次作业比较简单,我们主要是需要对新的框架调整我们对应代码的格式。

//Render()
framebuffer[m++] = scene.castRay(ray,0); // castRay(ray, current_depth);
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); //Moller trumbore算法中分母接近于0 即入射光线和平面平行
    if (fabs(det) < EPSILON)
        return inter;
//......
}
Intersection(){
        happened=false;  //是否碰撞
        coords=Vector3f(); //碰撞坐标
        normal=Vector3f(); //平面法向
        distance= std::numeric_limits<double>::max(); //射线长度/距离(t)
        obj =nullptr; //相交的物体,对于这个三角形,其继承于object类,因此即为this
        m=nullptr; //material 
    }
在macos 环境下配置games101 作业环境

在macos 环境下配置games101 作业环境

tcp

tcp

进程与线程的内存空间

进程与线程的内存空间

堆排序

堆排序

堆排序的过程为

建堆 从最后一个非叶子节点(对于节点编号为0~n-1的树,最后一个非叶子节点为n/2-1),按照堆的定义调整堆(即选择当前这个节点两个儿子节点(i*2+1,i*2+2)中的最大值,然后交换当前节点和该最大值节点)

×