![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
光线追踪
ARTELE
爱好计算机
展开
-
学习光线追踪(19)---光源[3]
0.简介目前,还有个问题没有解决,就是在场景中,所有光线的反射折射都对其余物体有影响,这些影响可以考虑处理。1.反射折射比如一个光源照到了镜面反射物体,那么此时镜面反射物体就相当于一个光源,再次对其余物体反射光线,此时,这类反射物体就可以被认为是一个光源,透镜并不只是对光源方向产生折射效果,对任何方向都有,只是因为有光照一面光线强,导致阴影产生,别的方向没有强光源,所以看不出来有阴影效...原创 2020-05-17 15:43:39 · 570 阅读 · 0 评论 -
学习光线追踪(19)---光源[2]
0.简介上次解决了光源问题,下面我们解决透明物体透光问题。注:贴出源码与最终源码可能有所不同,以最终源码为准。1.透明物体透明物体受到光照,比较直直观的就是透镜效果,放大镜聚焦这类的,我是这么考虑的,透明物体也相当于一种光源,只是这种光源和真正的光源不同,真正的光源发光点就是某个中心点,例如球形光源就是球的中心,但是透镜不是,透镜是透镜上所有点都有发光的可能,因为透镜"发"出的光是...原创 2020-05-17 15:43:56 · 559 阅读 · 1 评论 -
学习光线追踪(19)---光源[1]
0.简介目前我们的程序能模拟一些反射和折射的效果,但是,目前物体可见主要还是由于物体自身发光,也就是材质的light属性不为0,从这里开始,要彻底的实现光源发光,其余物体依靠光源的光反射光线的方法显示。注:贴出源码与最终源码可能有所不同,以最终源码为准。1.光源定义一个光源很简单,就是将光源材质的light设置一个大于0的数字,这就是光源,其余的等于0的都是非光源。2.阴影...原创 2020-05-17 15:44:42 · 790 阅读 · 0 评论 -
学习光线追踪(18)---镜面反射贴图
0.简介前面我们实现的镜面反射都是统一的反射指数,但是对于有些材质就不适合有太强的反光效果,通过镜面反射纹理来实现不同部位的反射效果不同1.添加纹理这里和纹理的使用差不多,将原来的参数替换成图片,这里的图片应该是一张灰度图如下图。箱子的反射贴图这个是木箱子的反射贴图,黑色的部分是不发生镜面反光的,白色部分是有镜面反光的。float HighMaterial::getSp...原创 2020-05-17 15:44:56 · 1660 阅读 · 0 评论 -
学习光线追踪(17)---BUG修改
0.简介之前就顾着一直写来着,中途出现了一些小问题,这里简单总结一下。1.盒体绘制这里后来我绘制了一个箱子,结果出现了神奇的问题,找了很久发现,是在计算箱子最近平面的时候找到平面就返回了,没有判断最小距离。所以做了新的补丁。Ray Triangles::intersect(Ray ray){ //一束光线只能在同一时间打在这个物体的一个位置上 float min = FLT...原创 2020-05-17 15:45:13 · 481 阅读 · 0 评论 -
学习光线追踪(16)---折射计算[2]
0.简介上一次实现了折射,看到了一个透明的球体,这次也是一次展示,放入了一个玻璃方块,就是一块玻璃砖。1.效果不在过多叙述就是添加了一个新的透明盒子折射效果可以看到地面上有一个透明的立方体。三角面是逆时针绘制的。2.源码release0.12...原创 2020-05-17 15:45:29 · 490 阅读 · 0 评论 -
学习光线追踪(16)---折射计算[1]
0.简介前面的反射效果已经和非光追渲染有很大区别了,这回加上折射计算,效果会更好。1.折射计算折射计算相对反射要复杂一点,折射公式网上有的是,我就不在这里进行推导和详细讲解了,有需要的可以看下面这篇博客。光线折射计算2.添加计算代码在之前的反射光线附近添加折射光线计算代码,然后折射也进行光追迭代。光线追踪迭代函数。Ray rayTrac(Ray ray, vect...原创 2020-05-17 15:45:42 · 1511 阅读 · 0 评论 -
学习光线追踪(15)---并发计算
0.简介该来的总会来,随着场景中的物体数目增加,光线反射的复杂程度增加,计算时间就成了问题,一张4096x4096的图像生成要好几十分钟,这要是在以后加入折射计算,随机漫反射等估计是看不到结果了。1.初步并发修改并发处理,可以适当加速,我在主函数中做了如下修改。这是原来的。 for (int i = 0; i < img.rows; i++) { for (int...原创 2020-05-17 15:45:52 · 339 阅读 · 0 评论 -
学习光线追踪(14)---法线纹理
0.简介如果想让上一次的墙面更加真实一些,就需要法线纹理来修饰一下了。1.法线纹理我这里简单介绍一下法线纹理,模型表变的法向量一般都比较单一,例如上一篇博客里的墙面,法向量都是朝向一面的,这就带来一个问题,墙面就很假,很光滑,跟瓷砖一样的感觉,但是实际的墙面并不是,而其根本原因就是表面的法向量导致光的反射方向一样,所以才像瓷砖一样反光,如果表面的法向量是接近于真实的,效果就会好很多,那...原创 2020-05-17 15:46:23 · 403 阅读 · 0 评论 -
学习光线追踪(13)---改进一下三角形碰撞光线的算法
0.简介之前绘制了一面墙之后,发现墙的斜对角有缝隙,找到了原因后,更换了其算法。这里借鉴下面这篇博客中介绍的随后一种方法。参考文章具体原理就不在重复了。1.修改为了方便对比,我把原来的算法和新的算法都整理成了一个新的函数,这样编码也规则很多。光线碰撞代码做了一些修改,将判断点在三角形内部换成了一个函数,而不是原来的一堆代码.Ray Triangle::intersec...原创 2020-05-17 15:46:13 · 754 阅读 · 0 评论 -
学习光线追踪(12)---画一面墙
0.简介最近事情很多,这算是才有些空写写,先拿一个简单的缓一缓,不然之前写的都快忘了。上次画出了三角形,又添加了纹理,这次画一个墙面做背景。1.墙面一面墙就是一个矩形平面,两个三角形拼接起来就可以了,但是三角形一个一个的声明比较麻烦,所以就新建一个类,专门绘制这种多个三角形组合。class Triangles : public Polygon{ vector<Trian...原创 2020-05-17 15:46:32 · 424 阅读 · 0 评论 -
学习光线追踪(11)---纹理加载
0.简介之前显示的图形中都是单一颜色的,这次我将纹理加上去,这样就可以显示更加丰富的元素了。1.纹理添加纹理功能需要对源程序多个地方修改,因为有了纹理就会增加纹理坐标的处理,所以在定义多边形的时候,就要在在原来顶点的基础上添加纹理坐标。然后根据光打在多边形上的位置,计算纹理坐标。2.纹理坐标定位为了能刚好的兼容各种i情况的纹理坐标,采用面积法来定位纹理坐标。纹理坐标示意图...原创 2020-05-17 15:46:39 · 537 阅读 · 2 评论 -
学习光线追踪(10)---三角形
0.简介在OpenGL或者D3D中,都有一个最基本的图元,就是三角形,三角形可以组成任意形状,并且计算起来也容易,为了能让我们绘制出更多的形状,这次来实现一个三角形类。1.三角形判断三角形在空间中形成了一个平面,所以,三角形一定在某个平面上,所以先判断光线是否能打到扫三角形所在平面,如果光线打到了三角形所在平面,那么再计算打在平面上的点是否在三角形内。判断光线是否打在平面上已经在上一节...原创 2020-05-17 15:47:08 · 820 阅读 · 0 评论 -
学习光线追踪(9)---平面
0.简介之前绘制的都是球体,现在我们来尝试绘制平面。1.平面平面表示方式有不少,这里用点法式,一个法向量和一个顶点。class Plane : public Polygon{public: Plane(); Plane(vec3 _normal, float _normal_distance, Material _m) :normal(_normal), normal_d...原创 2020-05-17 15:47:16 · 495 阅读 · 0 评论 -
学习光线追踪(8)---材质反射
0.简介这次实现以下反射效果,这里开始就涉及光线追踪原理了。1.反射光线反射,要经过多个物体反射,这里我们使用光线追踪方法,追踪折射光线。Ray rayTrac(Ray ray,vector<Polygon*> s,int times){ Ray r(vec3(0,0,0),vec3(0,0,0),0,vec3(0,0,0),nullptr); if (time...原创 2020-05-17 15:47:28 · 638 阅读 · 0 评论 -
学习光线追踪(7)---材质采样
0.简介前面可以显示出效果,这里我们将材质功能用上,让显示的物体具有更加真实的效果。1.光照模型光照模型一般比较常见的是phong模型,在这里涉及的光照效果更多,所以我们就分析一下我们自己的光照模型。先用一个比较简单的模型,就是物体自身就发光。Ray Polygon::sample(Ray out, Ray reflact, Ray refract){ Ray res(o...原创 2020-05-17 15:47:36 · 419 阅读 · 0 评论 -
学习光线追踪(6)---第一次显示
0.简介前面做了那么多准备,我们有了相机类模拟相机,有了球类,有了光线类模拟光线,现在就用这些东西来显示一下,算是一次调试。1.效果先来一张效果图。深度显示2.解析这次主要是将之前写过的功能整合了一下,并且对之前的类做了一些小修改。光线类中添加了一下东西。class Ray{public: //光线出发点 void* polygon = nullptr;...原创 2020-05-17 15:47:47 · 470 阅读 · 0 评论 -
学习光线追踪(5)---材质
0.简介材质,这里我不会讲的和教科书上的一样,所以也不要把我接下来要说的东西当作正确的,或者是标准的,因为这是我自己设计的,可能会有缺陷。1.材质参数材质一般会影响物体表面的反光,颜色,折射等。那么就将反光系数(正反光参数,漫反射参数),折射率,折射衰减,漫反射衰减,透光度,自发光参数,作为材质参数,自身颜色。class Material{public: //折射率,控制折...原创 2020-05-17 15:42:43 · 575 阅读 · 0 评论 -
学习光线追踪(4)---多边形
0.简介我们要建立一些多边形,球形比较好画,所以就先设计一个球的类。1.多边形基类以后还会有其他形状,所以,先设计一个多边形基类。class Polygon{public: //位置 vec3 position; //世界坐标矩阵 mat3 transforms; Polygon(); ~Polygon();};后面这个类还会有比较多的改动,这里先放两个重要...原创 2020-05-17 15:47:54 · 385 阅读 · 0 评论 -
学习光线追踪(3)---相机
0.简介相机应该都用过吧,手机上面有,数码相机什么的,原理是相机里面有接收光线的元件,就是感光元件,然后将光信号转换成电信号,之后就变成了我们拍摄出来的图像,这里我们来模拟一个相机,只不过我们的相机不是像真实的那样接收光线,而是要从相机发出光线,之后,根据相机发出的光线,追随着这些光线,找到光线能打到的无物体,然后再继续追踪反射,折射的光线,最后将本来是最终打到相机上的一束光线逆向的找到的来的...原创 2020-05-17 15:48:02 · 920 阅读 · 1 评论 -
学习光线追踪(2)---光线
0.简介光线追踪中,计算的是光线,我们这次设计一个光线类。1.光线类光线中,包含了几种属性,方向,出发点,颜色,强度,还有一个获取光线打到的点的函数。class Ray{public: //光线起点 vec3 position; //光线方向 vec3 direction; //光线颜色 vec3 color; //光的强度 float intensity;...原创 2020-05-17 15:48:10 · 444 阅读 · 0 评论 -
学习光线追踪(1)---环境配置
0.简介本着轻量级的目的,也是轻便的目的,所以环境我并没有用太多额外的东西,主要是两部分,一个是显示输出,一个是线性代数计算。1.GLM库这个在OpenGL编程中用的多一些,主要是矩阵向量计算的库,也不用编译,下载来配置好包含目录直接用。2.OpenCV这个用来显示图像,用这个原因是我电脑里正好有这个,并且配置简单,所以就用其作为显示输出,有点大才小用了。3.C...原创 2020-05-17 15:48:17 · 510 阅读 · 0 评论 -
学习光线追踪(0)---准备工作
0.介绍其实想晚一点写一篇相关博客,与大家分享一下最近学习的光线追踪,但是VS2019不太给力,出了BUG,这导致我之前写的代码丢了一部分,本打算是整理好一遍发的,这回正好,边整理边发吧。1.准备工作首先说明,我不是专门研究光线追踪的,只是觉得这个挺有意思,或者说效果挺让人震撼的,这不禁让我对其有了兴趣,然后就阅读了一些相关材料,之后就一发不可收拾。后面的例程都是基于C++开发,图...原创 2020-05-17 15:48:24 · 352 阅读 · 1 评论