问题六十七:ray tracing学习总结(2016.11.13, 2017.02.05)

从初识Raytracing到绘制复杂图形,本文记录了一位程序员通过实践学习光线追踪技术的心路历程。文中详细介绍了使用C++实现从基本图形到高级曲面绘制的方法,并探讨了如何模拟真实世界中的光效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从2016.11.13开始接触ray tracing到今天2017.02.05,差不多80天的时间。截至当前,学习ray tracing的过程,也是我重新找回自己或者说是“find what I love”的过程。不再浮躁,不再急功近利,不再认为“人活着就是为了赚钱”。我现在的观点是:对个人而言,活着的意义就是“find what we love”。

找到爱的人,快乐生活;找到爱的事,快乐工作。

也许是因为毕业多年,早已没有了当年的锋芒和伟大梦想了。一切都将归于平淡。

 

扯远了。ray tracing学习总结。

 

一开始,所有的事情都是陌生的。对于C++的理解只是“听说过”;对于“ray tracing”更是“闻所未闻”,只是感觉很厉害很好玩。YY是毫无意义的,一切都应该落到实处。脚踏实地,一步都不敢落空。

 

CodeBlocks环境搭建及创建第一个C++程序

 

搭好环境后,接着就开始学习《ray tracing in one weekend》。这个小册子对ray tracing进行了非常简洁的介绍,但是提供了非常实用的C++代码。接下来一段时间内敲的代码基本上都是抄这本书。

 

用C++输出第一张图片

这还只是一张图片,不是图形。贴图如下:


 

ray tracing中用到的C++的基础知识:

类的头文件和实现文件分别写什么?

inline

const

&(引用类型)

operator+=()(重载操作符)

::(域解析操作符)

抽象类,虚函数

构造函数的初始化列表

全局变量的使用

  

用ray tracing画第一个图形

这个是我们后面经常使用的“背景图”

 

用ray tracing画个球

 

“法向量”开始登场。

怎么可视化求的法向量?

贴图如下:

在生成这个图形的过程中,由于抄错了代码,生成了一个当时认为很神奇的图形,这个“神奇图形”从此成为了博客的头像。贴图如下:

 

怎么用ray tracing画多个球?

贴图如下:

 

怎么对ray tracing图形进行消锯齿?

消锯齿前后对比截图如下:

 

怎么模拟ray tracing图形的各种材质:漫反射镜面反射折射

包含以上三种材质的ray tracing图形贴图如下:

 

有时候XnView无法显示结果图片,怎么回事?

 

ray traing中的Positionable camera

“可定位相机”使得从不同角度观测图形可以得到不同的图片。如下贴图是在不同角度观测同一图形得到的图片:

 

ray tracing中的相机怎么模拟“景深(散焦模糊)”?

设置不同景深参数,得到不同的图片贴图如下:

 

生成《Ray Tracing In One Weekend》封面图形

贴图如下:

 

到目前为止,《ray tracing in one weekend》这个小册子已经全部学习完成。如上贴出的图片都是对应抄书上代码生成的图形。接下来学习《an introduction to ray tracing》,这本书上木有代码。所以,接下来的只能靠自己写代码来生成图形了。画了各种各样的surfaces

 

怎么用ray tracing画多边形(polygon)?

贴图如下:

 

怎么用ray tracing画box?

贴图如下:

对应的2048*1024的大图:

 

怎么用ray tracing画二次曲面?

椭球面单页双曲面、双页双曲面、椭圆锥面、椭圆柱面椭球抛物面双曲抛物面(马鞍面)

图形汇总

汇总图形贴图如下:

对应的2048*1024的大图:

 

后续的图形的texture中会用到Inverse Mapping,所以有先学习各种简单图形的Inverse Mapping。

球面Inverse Mapping凸四边形(含三角形)Inverse Maping圆Inverse Mapping圆柱面Inverse Mapping圆锥面Inverse Mapping

InverseMapping大合影

贴图如下:

uv原图:

映射到各个简单图形上时的输出图形:

 

怎么用ray tracing画圆环?

贴图如下:

 

任意圆柱面和圆环组合生成的图形

贴图如下:

大图~大图~看大图:

画圆环需要解一元四次方程。这个过程有遇到过:方程多根或者少根的情况,导致图形有多余像素或者像素缺失。

 

怎么用ray tracing画空间任意位置圆环的任意片段?

贴图如下:

 

ray tracing图形中的blending and joining surface?

贴图如下:

 

怎么用ray tracing画superellipsoid?

这里的超级椭圆面,和后面的超级双曲面、超级圆环的生成过程对应的方程已经无法用代数方法来解,我们借助牛顿迭代法来求其数值解。

贴图如下:

 

怎么用ray tracing画superhyperboloid?

贴图如下:

 

怎么用ray tracing画supertoroid?

贴图如下:

 

怎么用ray tracing画blobs?

贴图如下:

 

怎么用ray tracing画tear drop?

贴图如下:

 

后面在画参数方程表示的曲面时,会用到矩阵。怎么用C++实现矩阵的运算?

 

怎么用ray tracing画参数方程表示的曲面(1)

怎么用ray tracing画参数方程表示的曲面(2)—— bezier surface

怎么用ray tracing画参数方程表示的曲面(3)—— b-spline surface

画参数方程表示的曲面非常吃力。

(1)中画了一个球面和一个牛角面,贴图如下:

(2)、(3)中画的是普通的Bezier surface和b-spline surface,贴图如下(前边为Bezier,后边为b-spline):

之前,想用bicubicBezier patches画Utah teapot,生成的图形那叫一个“不堪入目”啊。贴图如下:


 

怎么用raytracing画translational sweeping图形?

怎么用ray tracing画conicsweeping图形?

用到3次b样条曲线。

贴图如下(前边为translational sweeping,后边为conic sweeping):

 

怎么用ray tracing画回旋体(rotationalsweeping / revolution)?

用到3次b样条曲线。

过程中需要解一元六次方程。

贴图如下:

 

怎么用raytracing画sphere sweeping图形?

用到3次b样条曲线。

过程中需要解一元十次方程。

贴图如下:

用sphere sweeping图形组合成一个teapot。贴图如下:

 

怎么用ray tracing画CSG(Constructive Solid Geometry 构造实体几何)图形?

贴图如下:

第一组:

第二组:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值