前言

由于上个月CSDN无故告诉我我的原创文章侵权(原创也侵权?),且我多日内多次申诉无效,于是我没有再更新自己的博客。今天我上CSDN的时候自己的文章(没有任何更改,莫名其妙就不侵权了?)又突然通过了,想着还是把这个系列更新完吧,不能半途而废。

上篇作业4

本篇继续更新作业5相关内容

作业5相关链接

games的作业5链接

我的源码

作业5简述

  • 使用光线追踪渲染图像

作业5相关知识笔记

  • Whitted-Style Ray Tracing(Soft shadows、Glossy reflection、Indirect illumination)
  • 克拉默法则
  • Axis-Aligned Bounding Box(AABB)

作业5思路

1.main函数梳理

可以看到main函数中新建了1280*960的场景以及定义两个sphere、一个mesh以及它们的材质颜色和两个光源。至于它们怎么实现的,分别写在了对应的c++文件中。

关于std::move(),我觉得知乎上这篇讲右值引用很好,或者参照《C++Premier》进行理解。

2.实现Reder()

首先要实现光线的生成,注意这里要对应到每个像素。而原Reder()中对应i,j为每个单位高度/宽度,我们要将i,j转化到单位像素上去。

原来scene内width应为(0,width-1),height应为(height -1,0)(从左上角开始遍历),而且在上面我们将scene进行了压缩到了[-1,1]的范围空间,所以这里i,j也要进行压缩,还原时也要乘上相应系数。查看原理

void Renderer::Render(const Scene& scene)
{std::vector<Vector3f> framebuffer(scene.width * scene.height);float scale = std::tan(deg2rad(scene.fov * 0.5f));float imageAspectRatio = scene.width / (float)scene.height;// Use this variable as the eye position to start your rays.Vector3f eye_pos(0);int m = 0;for (int j = 0; j < scene.height; ++j){for (int i = 0; i < scene.width; ++i){// generate primary ray directionfloat x;float y;// TODO: Find the x and y positions of the current pixel to get the direction// vector that passes through it.// Also, don't forget to multiply both of them with the variable *scale*, and// x (horizontal) variable with the *imageAspectRatio*            x = (((i + 0.5) / ((float)scene.width) * 2)-1) * imageAspectRatio * scale;y = (1 - (j + 0.5) / (float)scene.height * 2 )* scale ;Vector3f dir = normalize(Vector3f(x, y, -1)); // Don't forget to normalize this direction!framebuffer[m++] = castRay(eye_pos, dir, scene, 0);}UpdateProgress(j / (float)scene.height);}// save framebuffer to fileFILE* fp = fopen("binary.ppm", "wb");(void)fprintf(fp, "P6\n%d %d\n255\n", scene.width, scene.height);for (auto i = 0; i < scene.height * scene.width; ++i) {static unsigned char color[3];color[0] = (char)(255 * clamp(0, 1, framebuffer[i].x));color[1] = (char)(255 * clamp(0, 1, framebuffer[i].y));color[2] = (char)(255 * clamp(0, 1, framebuffer[i].z));fwrite(color, 1, 3, fp);}fclose(fp);
}

3.实现 rayTriangleIntersect()

这个公式课程中已经推导过了。

值得注意的是,在判断条件那里,如果用1-u-v >=0 ,会出现蓝点 ,当你打印出来蓝点坐标时,会发现其正好为最大的负值浮点数,这是因为u,v正好在三角形交界与射线交点处。所以这里我更改了判断条件。

bool rayTriangleIntersect(const Vector3f& v0, const Vector3f& v1, const Vector3f& v2, const Vector3f& orig,const Vector3f& dir, float& tnear, float& u, float& v)
{// TODO: Implement this function that tests whether the triangle// that's specified bt v0, v1 and v2 intersects with the ray (whose// origin is *orig* and direction is *dir*)// Also don't forget to update tnear, u and v.Vector3f E1 = v1 - v0;Vector3f E2 = v2 - v0;Vector3f S = orig - v0;Vector3f S1 = crossProduct(dir,E2);Vector3f S2 = crossProduct(S,E1);float temp = dotProduct(E1,S1);if(temp == 0 || temp <0)return false;u = dotProduct(S1,S)/temp;v = dotProduct(dir,S2)/temp;tnear = dotProduct(S2,E2)/temp;if(u >= 0 && v >= 0 && tnear >= 0 && (1 - u -v) >= -__FLT_EPSILON__){return true;}else{//if(u >= 0 && v >= 0 && tnear >= 0 &&(1 - u -v) < 0)//std::cout << u << v << tnear << std::endl;return false;}}

结果


如果不做特殊处理,会出现蓝点:

GAMES101-现代计算机图形学学习笔记(6)作业5相关推荐

  1. GAMES101-现代计算机图形学学习笔记(作业07)

    GAMES101-现代计算机图形学学习笔记(作业07) Assignment 07 GAMES101-现代计算机图形学学习笔记(作业07) 作业 作业描述 思路 结果 原课程视频链接以及官网 b站视频 ...

  2. GAMES101-现代计算机图形学学习笔记(作业02)

    GAMES101-现代计算机图形学学习笔记(作业02) Assignment 02 GAMES101-现代计算机图形学学习笔记(作业02) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...

  3. GAMES101-现代计算机图形学学习笔记(作业01)

    GAMES101-现代计算机图形学学习笔记(作业01) Assignment 01 GAMES101-现代计算机图形学学习笔记(作业01) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...

  4. GAMES101-现代计算机图形学学习笔记(作业03)

    GAMES101-现代计算机图形学学习笔记(作业03) Assignment 03 GAMES101-现代计算机图形学学习笔记(作业03) 作业 作业描述 思路 原课程视频链接以及官网 b站视频链接: ...

  5. Games101计算机图形学学习笔记:线性代数-向量

    目录 一.标量与向量 1.标量 2.向量 1.向量的方向 2.向量的长度 3.向量的计算 1.向量加法 2.向量的减法 3.向量的乘法 1.点乘 1.在图形学中我们经常使用点乘来计算两个向量的夹角,比 ...

  6. 计算机图形学学习笔记——Whitted-Style Ray Tracing(GAMES101作业5讲解)

    计算机图形学学习笔记--Whitted-Style Ray Tracing GAMES101作业5讲解 遍历所有的像素生成光线 光线与平面求交 遍历所有的像素生成光线 关于作业五中如何遍历所有的像素, ...

  7. 计算机图形学 学习笔记(五):多边形裁剪(Suther land-Hodgeman),文字裁剪

    接上文 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky 光栅图形学算法 3.4 多边形裁剪 之前上一篇文章中,我们介绍了直线段的裁 ...

  8. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

    接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结 在图形学中,有两大基本工具:向量分析,图形变换.本文将重点讲解向量和二维图形的变换. 5. ...

  9. 计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)

    接上文 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等 通过三维图形变换,可由简单图形得到复杂图形,三维图形变化则分为三维几何变换和投影变换. 6.1 三维图形几何变换 三维 ...

  10. 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky

    接上文 计算机图形学 学习笔记(三):多边形的区域填充算法,反走样算法 光栅图形学算法 本文主要讲解直线裁剪算法. 裁剪 使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的知识图形 ...

最新文章

  1. 禁用任何未使用的端口com_分享连接思科路由器控制台端口的正确设置
  2. 排序 np_干货 | XGBoost在携程搜索排序中的应用
  3. Python学习:元组
  4. Portal-Basic Java Web 应用开发框架:应用篇(十三) —— REST Convention
  5. 制作cab文件(Windows自带的makecab)
  6. mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解
  7. [Java]进程与线程的区别(转)
  8. Excel表中只能选择固定内容
  9. ubuntu/debian-bluster 用python安装 sasl 报错解决
  10. SpringBoot之自定义starter
  11. SCTF | 三足鼎立焦点对抗,天枢战队有惊无险斩获冠军头衔
  12. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)
  13. android系统自带system/app下载,Android 把应用APK安装包放到system/app下的方法
  14. 微信上线新功能 看到这个提醒一定要接听
  15. 问题解决:nvcc fatal : Unsupported gpu architecture ‘compute_75‘
  16. 【Windows11系统更新后蓝牙没了】
  17. 写给我的如风老男人(终结版)
  18. 将微信公众号内容同步到CSDN上的通知
  19. 不爱打空格的小孟c语言,语言学专家:很多年轻人发信息不爱用句号,其实都是有原因的...
  20. 蓝牙规范-Vol 6:低功耗控制器 Part A 物理层规范

热门文章

  1. Android中控件的显示和隐藏以及EditText的可编辑和不可编辑状态
  2. 缓存一致性协议-MESI
  3. js控制html元素的隐藏和显示
  4. 每天5分钟玩转openstack跟学(一)预备知识
  5. 7 个最好的 Word 转 PDF 转换器
  6. 为什么红黑树查询快_目前最详细的红黑树原理分析(大量图片+过程推导!!!)...
  7. ORA- 03113: end-of-file on communication channel
  8. Nmap使用教程图文教程(超详细)
  9. 央视春晚摇一摇最有可能颠覆哪些行业?
  10. 阻塞IO和非阻塞IO的区别