Raytrace学习的阶段性总结

最近一个月一直在学习RAYTRACE,从理论到代码实现,之前最近才终于有了一个比较完整的版本,遂打算把之前的一些学习经历写出来。

RAYTRACE又称光线跟踪,业界公认此算法为Turner Whitted在1980年提出,而它本身又是由原来的光线投射算法(ray casting)演变而来的,ray casting本身是用来消除场景中隐藏面的一种算法,Whitted将其扩展为递归算法后则成为了传统的raytrace算法。标准的raytrace一般采用逆向跟踪技术来完成整个绘制,即从视点出发计算屏幕上每一个像素点的颜色值。其大部分过程是于物体求交,若该光线击中物体,那么要先判断物体的材质,若为理想漫发射表面,则利用局部光照模型(因为可以方便地对顶点法向量进行插值,所以可以方便地使用phong着色模型)求出一个颜色值,若为镜面反射值或透射值,则产生一道反射(透射)光线,递归地计算,这也就是说假如当前场景所有物体都是理想漫反射材质的话,raytrace算法也就退化成了raycasting。当然实际实现的时候肯定没有上面说的这么简单,由于有太多细节要考虑,就简单说说实现的历程和效果吧。

1阶段.只有primary ray(raycasting)

对每个像素点进行投射求交,然后利用局部光照模型(phong)计算颜色值,并有阴影点判断(阴影点判断本身也是一个raycasting,即从该点到光源作一次光线投射,检测其中有没有障碍物)。

(图1)

2阶段.加入了reflection ray,这样就可以处理镜面,可以这样理解这个问题,当人的视线击中一个镜面的时候,那他还可以看见视线(可以想象为一条射线)由镜面发射之后击中的物体表面,这其中就多了一个求反射向量,和颜色叠加的过程。

(图2)

3阶段.加入了refraction ray,这样可以处理透明物体,当然光的折射满足折射定律,并且需要处理全反射和透射衰减的情况,并且一般的透明材质的内外表面都还有反射(这个地方感觉自己一直都处理得不好),具体的细节以后有时间的话再给出吧。

(图3)

4阶段.加入了简单的纹理映射,只针对球面和平面(因为目前这个阶段也只做了球,轴对齐矩形和轴平面这几个物体,还没有加入三角形)。而球面映射,我采用的也是最简单的经纬坐标映射。这个部分同时需要加载图像文件,由于时间有限,我自己只写了一个24位BITMAP的加载以及直接抄袭了Jacco Bikker的一段TGA加载的代码(实际上我从头到尾都参考了他的代码)。

(图4)

5阶段.加入了三角形的处理,加载OBJ文件模块,使用KD-TREE对场景进行优化,以及各种其他优化,不过效率仍然很低,特别是打开全屏抗锯齿以后。(还是感觉效果不是很好啊!)

(图5)

关于优化的一些心得:

1.stl在debug版本和release版本下的实现貌似不同,在debug版本下hash_map的find操作非常耗时,但是到了release版本竟然快如闪电,还有vector的一些操作也是这样,让我白白花费了好多时间来尝试对其进行优化。

2.对于文件的读入,特别是一些大的模型.obj文件或texture通常都是几兆甚至数十兆,应该尽量一次性全部读入内存(最多分几次读入)然后再进行分析,加载模型这一个函数就够你受的。

3.在关键代码处最好不要用运算符重载。运算符重载虽然可以使代码的可读性大幅提高,但是在执行频率很高的代码段还是别用的比较好,记得有一次就是只改了一个求交函数中的运算符重载代码,结果计算时间直接从8s减至7s。

不过即使这样效率仍然较低,没有用SSE优化,KD-TREE里的SAH划分子空间标准也没有完全实现,勉强能应付三角形面在10W以下的场景。

后记:接下来可能会打算将RAYTRACE移植到GPU上,利用GPU强大的并行计算能力来加速。同时开始学习GI。争取以后再实现一些multipass的渲染算法,如photon mapping。还有太多的东西要学习,努力!

转载于:https://www.cnblogs.com/starfallen/archive/2012/11/07/2759678.html

Raytrace学习的阶段性总结相关推荐

  1. CocosCreator知识库amp;amp;lt;二amp;amp;gt;关于TiledMap的系统学习教程(阶段性更新)

    CocosCreator知识库<二>关于TiledMap的系统学习教程<26/12/2017>(长期更新,看不懂先大致总体搞一遍,然后回头细看)                 ...

  2. 学习图像算法阶段性总结 (附一键修图Demo)

    今天特别感慨,自己从决定研究图像处理,势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物,当你做不到的时候,你以为做到了,自己会感觉很爽,很有成就感 ...

  3. 如何让自己像打王者荣耀一样发了疯、拼了命、石乐志的学习?

    如何让自己像打王者荣耀一样发了疯.拼了命.石乐志的学习? 阶段性反馈机制(如何持之以恒.让自己发疯) 反馈机制是王者荣耀的核心武器,击杀野怪获得金币,击杀敌人之后的画面.音效刺激大脑,不断地努力,获得 ...

  4. 最新web学习路线及课程大纲

    学习web前端的同学越来越多,怎么学,从哪里开始学可能很多同学都摸不到头脑,那么今天就给大家分享web前端学习路线及课程大纲给大家,相信有了这份web前端工程师教程大纲大家能更清晰的找到自己的学习路径 ...

  5. 强化学习——基础概念

    强化学习--基础概念 一.强化学习问题的提出 奖励 Reward 环境 Environment 状态 State 二.智能体 Agent 策略 Policy 价值函数 Value function 模 ...

  6. 算法很重要,但是,并非所有,并不是每个人的选择

    [信] 何老师,你好. 我是一个软件project大二.两年下来.我有很好的成绩,此外,他自学了一些事情.大一的时候我自学C++.NET编程.然后看着别人写的炸弹人的代码自己也写了一个(感觉像是抄了一 ...

  7. 双一流校长:学校要扩大博士生规模!适当控制硕士生规模,因为住宿条件跟不上了...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨四川大学新闻网"百川讲坛"栏目,原题为<校长李言荣在四川大学研究生教育 ...

  8. 院士:人一生有两个阶段最能逼出成果,一是拿博士学位,二是评正教授

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 来源:算法与数学之美 虽然这是一位大学校长在全校研究生教育工作会上的"内部讲话&qu ...

  9. 计算机网络期中考试总结反思,期中考试总结反思作文(通用6篇)

    期中考试总结反思作文(通用6篇) 导语:在平平淡淡的学习.工作.生活中,大家最不陌生的就是作文了吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向.为了让您在写作文时更加简单方便, ...

  10. 【机器学习】最近邻算法KNN原理、流程框图、代码实现及优缺点

    通过机器学习教学视频,初识KNN算法,对原理和算法流程通过小应用进行Python实现,有了自己的一些理解.因此在此整理一下,既是对自己学习的阶段性总结,也希望能和更多的朋友们共同交流学习相关算法,如有 ...

最新文章

  1. 用onerror处理图片获取失败问题
  2. php和python性能-python、node、php、go、java性能对比测试
  3. 多线程学习-基础(四)常用函数说明:sleep-join-yield
  4. angularJs自定义模块
  5. 数据库MySQL/mariadb知识点——操作篇(2)库管理语句
  6. 爱奇艺数据中台负责人马金韬:数据中台建设与应用
  7. WordPress 主题教程 #3:开始 Index.php
  8. qt 使用插件astyle_astyle使用基础教程
  9. AndroidStudio中获得的VersionCode一直为1和VersionName一直为1.0
  10. 高等数学上下册及习题解析(同济第七版)
  11. 【蓝桥杯真题】蓝桥杯真题之旋转
  12. BTP-2118 玩 GTA5
  13. 易基因|m6A甲基化修饰在神经元发育和成体神经形成中的作用研究:文献科普
  14. Leetcode 1653. 使字符串平衡的最少删除次数
  15. chrome浏览器的devtools详解
  16. 写给准备參加秋招的学弟学妹们~一定要来看哦~
  17. sense8影评摘抄
  18. 三运放差分放大电路分析_三运放组成的差分放大器电路图及特点
  19. c语言中的正弦函数与余弦函数
  20. 智能客服,还有多少AI泡沫?

热门文章

  1. 生意参谋指数之指数推理原值
  2. JS获取浏览器高度和宽度
  3. python实现葵花8号(Himawari-8)的WLF数据自动下载与数据库导入
  4. ThinkpadX220 windows10 博通bcm94352hmb的蓝牙连接音箱播放声音断断续续的解决方案
  5. linux 将ext2变成ext4文件系统
  6. ResNet网络结构搭建
  7. centos光盘修复引导_CentOS7修复安装
  8. 手机号码好坏什么软件测试,测试你的手机号码好不好(很准哦)
  9. 三农数据(1990-2020)七:农村居民家庭生产现金支出、农村固定资产构成、固定资产投向
  10. Nginx配置跨域(CORS)