More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. 计算机图形学
  3. 正文

现代计算机图形学 作业5 解析(2)

2021年8月7日 504点热度 0人点赞 0条评论

现代计算机图形学 作业5 解析(2)

上次我们说完了生成的光线,这次我们要正式进入光线追踪的过程中了

来到castRay中,可以看到上面的注释,注释中写了对于几种材质的处理

对于我们这次框架来说,材质要么是反射和折射的,要么是反射,要么是漫反射的,我们对于每种情况分别处理

递归的过程中记录深度,如果深度超出了最大递归的深度,我们就不在累计贡献

然后首先默认将hitColor设置成背景颜色

然后下面的if也是C++的一个新特性,可以在if语句中进行初始化,我在我最早的一篇文章中也有提过。

这里我们不进入到trace的具体实现细节中去,这样可以让我们有一个更好的全局视野,但是我们需要搞清楚trace是干什么的

跟踪到函数定义,可以看到最上面的函数描述,返回的是光线是否打到一个物体上,同时我们会获得对应的物体,三角形的索引,对应三角形的质心坐标以及光线方程中的t

然后我们可以通过t来计算光线与物体的交点,并且获得对应交点的一系列参数,比如我们交点处的st坐标,即对应的纹理坐标(uv坐标和st坐标是一样的)

向下看可以法线有三种情况,首先对于反射和折射的情况,我们分别通过入射方向和法线计算光线的方向,然后再根据光线方向与法线的方向为交点加上一个小的偏移,这样我们就可以得到出射光线的方向和出射点

得到光线后,我们递归调用castRay来分别计算反射和折射对当前点造成的贡献,fresenl就是菲涅尔项,用来解释反射光和入射光的强度

对于下面的只有反射的情况就比较简单了,我们只计算反射项既可

然后就是下面的漫反射的情况,在注释中有写到,我们用blin-phong模型来解决

这里有一个值得注意的一点,就是我们计算阴影,我们从击中点到光源发射一条光线,然后计算光线的距离和点到光源的距离来判断当前点是否在阴影中

然后用计算出来的系数乘上我们的纹理颜色,再加上高光项,但是这里貌似是有一个错误的,我个人感觉高光项需要加上阴影的影响,目前还不确定为什么高光没有加,可能影响比较小?

之后就可以来到trace中看一下了,逻辑还是比较明显的,就是迭代每个物体来求交点,然后看object的intersect,就是迭代每个三角形求交点,然后就可以到需要我们实现的rayTriangleIntersect了

这里直接翻译ppt上的公式,然后判断一下最后光线的t需要是正的,同时质心坐标为正即可

最后上一张图

20210807223328

标签: 图形学
最后更新:2021年8月17日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS