Whitted光线追踪
更详细的内容可以看知乎的这篇文章。
这里简要的说了一下几何光学的规则。
这里引出了光线追踪:正向(从光源开始)和反向(从眼睛开始)。
在介绍光线追踪前,先来看一些比较简单的。
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=1dKri<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光线追踪相关推荐
- Whitted光线追踪实现
Whitted光线追踪实现 Whitted光线追踪是的光线追踪中最经典示例之一.该技术由特纳·惠特(Turner Whitted)于1980年在Siggraph论文"用于阴影显示的改进的照明 ...
- GAMES101作业5-从头到尾理解代码Whitted光线追踪
目录 Whitted Ray-Tracing Whitted光线追踪 What Why How 1 发射主射线primary ray 实现步骤 (1)定义相机 (2)计算primary主射线的方向 R ...
- 闫令琪:Games101 现代计算机图形学-光线追踪(三):渲染方程和路径追踪path ray tracing 作业Assignment07解析
文章目录 0 whitted光线追踪的局限 1 辐射度量学 1.1 光线的表示 Radiance 1.2 物体表面上一个点的亮度 Irradiance 1.3 BRDF(Bidirectional R ...
- 计算机图形学【GAMES-101】8、辐射度量学与光线追踪
快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...
- GAMES101-现代计算机图形学入门-闫令琪 - lecture13 光线追踪1(Ray Tracing 1 - Whitted-Style Ray Tracing) - 课后笔记
光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing) 课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的 ...
- Unity3d 周分享(17期 2019.5.18 )
选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1. [Unity]介绍可以在游戏画面上显示FPS,内存,音频,设备信息的" ...
- 【技术美术图形部分】PBR直接光部分:Disney原则的BRDF和次表面散射模型
写在前面 补充去年遗漏下的知识.很多叙述都是参考了众多大佬的文章!因为是作为个人学习总结的博客,所以直接卑微的借鉴过来了,后面会给出所有参考的文章. 另外,放上一个忘了在哪一篇知乎评论里的截图: 说的 ...
- GAMES101作业7提高-实现微表面模型你需要了解的知识
目录 微表面材质模型 微平面理论 Microfacet Theory BSDF(浅浅的提一下) 微表面BRDF的实现 Cook-Torrance BRDF 漫反射的BRDF 镜面反射的BRDF 1 法 ...
- GAMES101作业7-路径追踪实现过程代码框架超全解读
目录 Path Tracing算法过程讨论 蒙特卡洛积分 直接光照 direct illumination 间接光照 indirect illumination 编辑 合成全局光照 解决一些存在的问 ...
最新文章
- bs4库的prettify()方法|粉饰的意思。就是多了换行!
- SpringBoot-MyBatis
- 低碳生活:充电电池及充电器
- Java整合Spring发送邮件
- AspectJ 中的pointcut 语法
- 用Dreamweaver+ASP实现分页技术的参考
- matlab iradon函数详解,如何处理iradon函数所得图像
- VARCHART XGantt适用于.NET v5.1 Build 337
- [JZOJ6042]【NOI2019五校联考2019.3.5】Second【SA】【分治】
- ZT ---- 给孩子的信(孩子写给爸爸妈妈的信在24、25、26楼)
- 网易云音乐外链对比制作
- 使用Python实现淘宝订单定时付款
- 【数据库 · MySQL】听韩顺平老师课草稿
- html边框直线代码,网页制作学习:实现细线边框的两种方法_html
- 搜狗输入法linux在哪,在Linux中安装搜狗输入法
- 计算机毕业设计SSM选题推荐 宠物领养管理系统 宠物管理系统 宠物医院管理系统 宠物救助系统
- 串口硬盘GHOST死机
- Spring Security入门基础
- 【VBA】一行代码删除所有空行
- RFID资产管理的应用效果
热门文章
- 马里兰大计算机专业学phd博士,美国纽约州立大学石溪分校计算机专业博士CS PHD全奖OFFER...
- python中count是什么意思_python中函数COUNT()的功能是什么
- FPGA学习日记(八)SDRAM的读写测试
- qq不能发说说显示服务器错误,qq为什么发送不成word服务器拒绝发送离线请求. - 卡饭网...
- 用Origin将Fluent中的数据导出并绘制云图
- combo 口切换配置
- PO:通过Floder限制订单汇总中采购单价及金额栏位
- 颈椎病及腰椎间盘突出病因病理
- MFC图形界面编辑工具
- Android app跳转QQ加人聊天或者加群