更详细的内容可以看知乎的这篇文章。

这里简要的说了一下几何光学的规则。

这里引出了光线追踪:正向(从光源开始)和反向(从眼睛开始)。

在介绍光线追踪前,先来看一些比较简单的。

WhittedWhittedWhitted光线追踪算法,结合了反向光线追踪和raystolightrays\ to\ lightrays to light(看图会更清晰一点),而且需要递归计算。具体的算法:1.1.1.对于每个像素,沿VVV方向跟踪主光线到第一个可见表面。2.2.2.对于每个交点,跟踪次光线:ShadowraysShadow\ raysShadow rays,即从交点到光源的LiL_iLi​、ReflectedrayReflected\ rayReflected ray反射光线,如图中的RRR所示、RefractedrayRefracted\ rayRefracted ray(折射光线)或者transmittedraytransmitted\ raytransmitted ray(透射光线),如图中的TTT所示。

结合图示会更加清楚。

现在让我们逐步构建光剑追踪器,首先是光线投射和局部照明。

直接照明,首先给出了射线的定义,IdirectI_{direct}Idirect​通过Blinn−PhongBlinn-PhongBlinn−Phong模型计算。

跟踪中的着色,看见这个公式了吗,是不是和Blinn−PhongBlinn-PhongBlinn−Phong模型中的有点像?

在这个基础上,我们做了两个修改:1.1.1.距离衰减AjdistA_j^{dist}Ajdist​的最大值为111;2.2.2.需要包含阴影衰减AjshadowA_j^{shadow}Ajshadow​。这个公式就是光线追踪中的着色公式。

光线追踪伪代码。我们通过向每个像素投射光线来构建光线跟踪图像。COPCOPCOP即centerofprojectioncenter\ of\ projectioncenter of projection(投影中心),dˉ\bar{d}dˉ为投射光线的方向向量,scenescenescene为场景,那么可以计算得到(t,N,mtrl)(t,N,mtrl)(t,N,mtrl),ttt为交点距PPP的距离;Nˉ\bar{N}Nˉ为交点处的法向量;mtrlmtrlmtrl即materialmaterialmaterial,交点处的材质;那么也可以得到交点QQQ的坐标;把−dˉ-\bar{d}−dˉ作为视线(反向光线追踪),即可通过shadeshadeshade(Phong/Blinn−PhongPhong/Blinn-PhongPhong/Blinn−Phong)计算出交点处的颜色。

着色伪代码。首先处理物体本身的发光(与材质有关)以及全局环境光,然后开始逐一处理光源(多光源),先计算距离衰减attenattenatten和QQQ到LightLightLight的方向,然后计算漫反射diffusediffusediffuse和镜面反射specularspecularspecular,再把他们累加起来。

现在我们考虑阴影—通过投射阴影线来实现。

带阴影的着色。与之前的大体相同,多了求阴影衰减shadowAttenshadowAttenshadowAtten的过程。

这张图说明了如何计算阴影衰减。它可以简单到仅仅判断光线是否可以到达光源,这里以点光源为例,getDirection(P)getDirection(P)getDirection(P)可以得到PPP到光源的方向向量dˉ\bar{d}dˉ,把它当作一条射线并与场景计算交点,从而得到交点到PPP的距离ttt,此时我们再计算光源到PPP的距离tlightt_{light}tlight​,如果t<tlightt<t_{light}t<tlight​,说明被阻挡了,此时应返回(0,0,0)(0,0,0)(0,0,0)(黑色),否则应返回(1,1,1)(1,1,1)(1,1,1)。对于方向光源,我们可以认为tlightt_{light}tlight​为无穷大。

加上反射光。

设I(P,dˉ)I(P,\bar{d})I(P,dˉ)是沿射线看的强度,那么有I(P,dˉ)=Idirect+IreflectedI(P,\bar{d})=I_{direct}+I_{reflected}I(P,dˉ)=Idirect​+Ireflected​,IdirectI_{direct}Idirect​是由Blinn−PhongBlinn-PhongBlinn−Phong模型计算出来的(带阴影衰减),IreflectedI_{reflected}Ireflected​等于Kr∗I(Q,Rˉ)K_r*I(Q,\bar{R})Kr​∗I(Q,Rˉ),KrK_rKr​为反射系数,QQQ为交点,Rˉ\bar{R}Rˉ为反射光,显然这是一个递归过程—递归计算反射光的强度。一般我们会令Kr=KsK_r=K_sKr​=Ks​,即反射系数和镜面反射系数相等。

依据反射定律有θi=θrθ_i=θ_rθi​=θr​,Rˉ、dˉ、Nˉ\bar{R}、\bar{d}、\bar{N}Rˉ、dˉ、Nˉ三者共面。

更新一下光线追踪的伪代码。

终止递归的条件:1.1.1.当递归深度大于最大限制时;2.∏i=1dKri<Thresh2.\prod_{i=1}^{d}K_{ri}<Thresh2.∏i=1d​Kri​<Thresh时,也就是说经过几次反射后,系数太小了,这点贡献可以忽略掉。

加上折射光。

TTT是折射光,KtK_tKt​是折射系数,一般我们令Ks=KrK_s=K_rKs​=Kr​,且Kt=1−KsK_t=1-K_sKt​=1−Ks​,如果物体不透明的话应该令Kt=(0,0,0)K_t=(0,0,0)Kt​=(0,0,0)。

折射定律。ni、ntn_i、n_tni​、nt​为折射率,由于dˉ、Nˉ\bar{d}、\bar{N}dˉ、Nˉ已知,所以sinθisinθ_isinθi​的值很容易得到,那么有sinθt=ni∗sinθi/ntsinθ_t=n_i*sinθ_i/n_tsinθt​=ni​∗sinθi​/nt​。

上面是Tˉ\bar{T}Tˉ的推导过程,由于我们并不关心Tˉ\bar{T}Tˉ的长度,所以可以对结果进一步化简,使得Tˉ=(ncosθi−cosθt)Nˉ−nVˉ\bar{T}=(ncosθ_i-cosθ_t)\bar{N}-n\bar{V}Tˉ=(ncosθi​−cosθt​)Nˉ−nVˉ。

但是在计算折射光时,一定要考虑全内反射的情况。我们知道sinθt=ni∗sinθi/ntsinθ_t=n_i*sinθ_i/n_tsinθt​=ni​∗sinθi​/nt​,当θt=90°θ_t=90°θt​=90°时,θiθ_iθi​达到了临界角θcθ_cθc​,如果θi>θcθ_i>θ_cθi​>θc​,就会发生全反射现象,此时没有折射光。

现在可以进一步完善我们的光线追踪伪代码了。由于计算折射光线时要考虑折射率ni、ntn_i、n_tni​、nt​,所以需要判断射线是正在进入物体还是传出物体,计算Nˉ∗Vˉ\bar{N}*\bar{V}Nˉ∗Vˉ并与000进行比较即可知道。

再次回顾一下阴影衰减。我们之前只是简单的判断了一下交点到光源之间是否有障碍物,有就返回(0,0,0)(0,0,0)(0,0,0)(黑色),否则就返回(1,1,1)(1,1,1)(1,1,1)。但是如果路径上有透明对象怎么办?正确的办法是把这些透明对象的ktk_tkt​依次累成起来作为结果(由于一个物体可以被进入、穿出,所以可能会多次累乘一个物体的ktk_tkt​)。这种模型简单的认为颜色只会在物体的表面,就像透明玻璃表面上的颜色涂层一样。

但是还有另外一种模型是认为玻璃的内部也有颜色的,在此不多赘述。

如图所示,当我们从物体内部穿出时,法向量其实是垂直于平面朝外的,所以在计算着色、反射、折射前需要先对法向量取反。而且在对物体内部的点进行着色时,环境光应该再乘上ktk_tkt​,因为它必须穿过物体表面才能达到物体内部。

误差控制。因为计算往往涉及到浮点数,可能会有误差,所以一般会引入一个极小数进行误差控制。

球体、三角求交可以看我这篇博客。这里再讲一下坐标系的一些问题。

从上图可以看出,求交前先将光线转换成物体的局部坐标,如果有交点,再把交点处的法向量转换为全局坐标。

Whitted光线追踪相关推荐

  1. Whitted光线追踪实现

    Whitted光线追踪实现 Whitted光线追踪是的光线追踪中最经典示例之一.该技术由特纳·惠特(Turner Whitted)于1980年在Siggraph论文"用于阴影显示的改进的照明 ...

  2. GAMES101作业5-从头到尾理解代码Whitted光线追踪

    目录 Whitted Ray-Tracing Whitted光线追踪 What Why How 1 发射主射线primary ray 实现步骤 (1)定义相机 (2)计算primary主射线的方向 R ...

  3. 闫令琪:Games101 现代计算机图形学-光线追踪(三):渲染方程和路径追踪path ray tracing 作业Assignment07解析

    文章目录 0 whitted光线追踪的局限 1 辐射度量学 1.1 光线的表示 Radiance 1.2 物体表面上一个点的亮度 Irradiance 1.3 BRDF(Bidirectional R ...

  4. 计算机图形学【GAMES-101】8、辐射度量学与光线追踪

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  5. GAMES101-现代计算机图形学入门-闫令琪 - lecture13 光线追踪1(Ray Tracing 1 - Whitted-Style Ray Tracing) - 课后笔记

    光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing) 课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的 ...

  6. Unity3d 周分享(17期 2019.5.18 )

    选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1. [Unity]介绍可以在游戏画面上显示FPS,内存,音频,设备信息的" ...

  7. 【技术美术图形部分】PBR直接光部分:Disney原则的BRDF和次表面散射模型

    写在前面 补充去年遗漏下的知识.很多叙述都是参考了众多大佬的文章!因为是作为个人学习总结的博客,所以直接卑微的借鉴过来了,后面会给出所有参考的文章. 另外,放上一个忘了在哪一篇知乎评论里的截图: 说的 ...

  8. GAMES101作业7提高-实现微表面模型你需要了解的知识

    目录 微表面材质模型 微平面理论 Microfacet Theory BSDF(浅浅的提一下) 微表面BRDF的实现 Cook-Torrance BRDF 漫反射的BRDF 镜面反射的BRDF 1 法 ...

  9. GAMES101作业7-路径追踪实现过程代码框架超全解读

    目录 Path Tracing算法过程讨论 蒙特卡洛积分 直接光照 direct illumination 间接光照 indirect illumination ​编辑 合成全局光照 解决一些存在的问 ...

最新文章

  1. bs4库的prettify()方法|粉饰的意思。就是多了换行!
  2. SpringBoot-MyBatis
  3. 低碳生活:充电电池及充电器
  4. Java整合Spring发送邮件
  5. AspectJ 中的pointcut 语法
  6. 用Dreamweaver+ASP实现分页技术的参考
  7. matlab iradon函数详解,如何处理iradon函数所得图像
  8. VARCHART XGantt适用于.NET v5.1 Build 337
  9. [JZOJ6042]【NOI2019五校联考2019.3.5】Second【SA】【分治】
  10. ZT ---- 给孩子的信(孩子写给爸爸妈妈的信在24、25、26楼)
  11. 网易云音乐外链对比制作
  12. 使用Python实现淘宝订单定时付款
  13. 【数据库 · MySQL】听韩顺平老师课草稿
  14. html边框直线代码,网页制作学习:实现细线边框的两种方法_html
  15. 搜狗输入法linux在哪,在Linux中安装搜狗输入法
  16. 计算机毕业设计SSM选题推荐 宠物领养管理系统 宠物管理系统 宠物医院管理系统 宠物救助系统
  17. 串口硬盘GHOST死机
  18. Spring Security入门基础
  19. 【VBA】一行代码删除所有空行
  20. RFID资产管理的应用效果

热门文章

  1. 马里兰大计算机专业学phd博士,美国纽约州立大学石溪分校计算机专业博士CS PHD全奖OFFER...
  2. python中count是什么意思_python中函数COUNT()的功能是什么
  3. FPGA学习日记(八)SDRAM的读写测试
  4. qq不能发说说显示服务器错误,qq为什么发送不成word服务器拒绝发送离线请求. - 卡饭网...
  5. 用Origin将Fluent中的数据导出并绘制云图
  6. combo 口切换配置
  7. PO:通过Floder限制订单汇总中采购单价及金额栏位
  8. 颈椎病及腰椎间盘突出病因病理
  9. MFC图形界面编辑工具
  10. Android app跳转QQ加人聊天或者加群