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

    xiaoxiao2021-03-26  25

    从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 构造实体几何)图形?

    贴图如下:

    第一组:

    第二组:

    转载请注明原文地址: https://ju.6miu.com/read-661622.html

    最新回复(0)