计算机图形学笔记十一:Ray Tracing1(阴影,光线追踪基本原理)
阴影,光线追踪基本原理
- 1.阴影贴图(Shadow Mapping)
- 1.1产生步骤
- 1.2存在问题
- 2.光线追踪( Ray Tracing)
- 2.1为什么需要光线追踪?
- 2.2基础光线追踪算法(Basic Ray-Tracing Algorithm)
- 2.3Whitted风格的光线追踪(Whitted-Style Ray Tracing)
- 2.4计算光线和物体表面的交点
- 2.4.1光线的表示
- 2.4.2光线和隐式曲面的交点
- 2.4.3计算光线和显式曲面的交点
1.阴影贴图(Shadow Mapping)
图形学中阴影的产生原理:对于一个点来说,如果它位于阴影中,则说明摄像机能看到这个点,但是光源无法看到这个点;如果位于阴影外,则说明摄像机能看到这个点,同时光源也能看到这个点。
注:
- Shadow Mapping 只能处理点光源的阴影;
- 产生的为硬阴影(没有平滑过渡);
1.1产生步骤
Step1:从光源出处看向物体,进行一次透视投影,只记录下投影后光能看到的点的深度信息(Z-Buffer)
Step2:从真正的相机视角去对当前场景进行透视投影,将相机看到的所有点,全部通重新投影到光源相机上,又会得到一副深度图
Step3:将Step2中生成的深度图像与Step1中生成的深度图像进行比较,看上面记录的点的深度是否一致(一致则说明点光源能看到该点,即该点不在阴影中,可见;反之在阴影中,不可见)
如上图所示,从摄像机投影回光源,进行比较,如橘色线上的点,这点能被光照照射到,就不处于阴影中,可见;而红线上的点就被判定处于阴影中,不可见。
1.2存在问题
1)计算结果均为浮点数,不宜比较是否相等,一般通过让两个浮点数做差,结果小于某个极小的数就认为这两个浮点数相等;
2)由于要求的是点光源,而点光源不存在大小,产生的为硬阴影,不符合实际中的阴影,真实的如下图的第二张图所示,称为软阴影;
3)阴影贴图也是贴图的一种,阴影贴图的分辨率和实际渲染的分辨率如果不匹配,即纹理分辨率过大或过小引起的问题,如锯齿和摩尔纹。
2.光线追踪( Ray Tracing)
2.1为什么需要光线追踪?
1)光栅化并不能很好的处理全局影响,如下图所示的几种反射:
2)虽然光栅化处理很快,但质量较低,如下图所示:
3)由于光线追踪生成速度非常缓慢,一般用于制作动画视频时使用,而光栅化一般使用于实时场景渲染:
2.2基础光线追踪算法(Basic Ray-Tracing Algorithm)
三个思想基础:
- 光总是沿直线传播的
- 光线与光线之间不会发生碰撞
- 光线的可逆性,即光线到达眼睛后,眼睛发出的光同样能返回光源
基础光线追踪的过程:
Step1:从摄像机看向物体,类似发出光线(eye ray),首先穿过图像平面(image plane,透视投影中的近平面),直到最初接触到某个物体的表面;
如果一条光线可以穿过多个物体,仍只需记录第一个被照射到的物体,后面的物体默认为被遮挡上了,处于阴影中,眼睛看不到,如上图虚线所示
Step2:将相交点与光源连接,判断是否处于阴影中,若不处于,则在image plane对应的网格位置记录该点的颜色信息等,不断重复操作直到用眼睛发出的光线遍历完image plane中的所有像素点
然而,这样做得到的结果与Blinn-Phong光照模型得到的结果一样,缺少现实物体的反射和折射功能,所以引入Whitted风格的光线追踪。
2.3Whitted风格的光线追踪(Whitted-Style Ray Tracing)
Whitted-Style Ray Tracing很不错的解决了折射和反射相关的投影到视觉图上的效果:
实现过程:
Step1:和上述的基础光线追踪的Step1步骤一样,只是有多添加了光线的反射和折射
注:当光线打到光滑的物体表面时,会同时发生折射和反射
Step2:将上述四个点分别与光源连接,然后在像素块中按一定的权重比例记录下颜色信息(如直射光线60%,折射反射光线占40%等)
2.4计算光线和物体表面的交点
2.4.1光线的表示
光线就是一条射线,一个向量,由起点,方向和时间构成:
2.4.2光线和隐式曲面的交点
以光线和球的交点为例:
求光线和球的交点实质上就是求同时满足光线方程和球方程的点:
方程求解:
由方程解 t t t的数量来判断有几个相交点(0个,1个,2个),若为2个,则取离光线最近的交点。
由此可以推广应用到所有隐式曲面的交点:
表面交点P都可以由物体方程等于0来表示( f ( p ) = 0 f(p)=0 f(p)=0),然后让光线方程和P点方程联立,解方程即可。
2.4.3计算光线和显式曲面的交点
如上图所示,为光线与显式曲面的交点,可以看出,其交点其实就是与三角形面的交点,因此转化问题为计算光线与三角面的交点。
首先先做该三角形所在平面,平面由法向量和平面上的一点定义:
联立光线方程和点P方程,解方程;求得t之后,代入光线方程,就能得到交点了:
得到了交点之后,就能进一步判断该点是否在三角形内了。
由于判断点是否在三角形内较为麻烦,所以引出新的直接求交点方法
Möller Trumbore 算法:
求解交点位置之后,也顺带判断了该点是否在三角形内部
如上图所示,引用之前所学知识(如何判断平面内一点和三角形的关系),即 a P 0 + b P 1 + c P 2 = P aP_0+bP_1+cP_2=P aP0+bP1+cP2=P(其中a+b+c=1; P 0 , P 1 , P 2 P_0,P_1,P_2 P0,P1,P2是三角形的三个顶点;如果该点P位于三角形内部,那么a,b,c均为非负数),因此可以得到图中上方公式。可以将where下的方程代入左侧方程中,解这三个方程即可计算出(t,b1,b2)。
那是这上述所说的计算交点的方法都是非常耗时的,为了能够更快的提高计算交点的速度,我们引入包围盒(Bounding Volumes)概念。
计算机图形学笔记十一:Ray Tracing1(阴影,光线追踪基本原理)相关推荐
- 计算机图形学笔记(一)渲染管线概述
计算机图形学笔记(一)渲染管线概述 写在前面:因为之前有学习过图形学,博文是对过去知识的拾遗和对学习过程中的总结记录,所以在内容组织上可能不符合逻辑,某些比较熟悉的内容不会体现或简述:在整理资料的时候 ...
- 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...
- GAMES101-现代计算机图形学入门-闫令琪 - lecture13 光线追踪1(Ray Tracing 1 - Whitted-Style Ray Tracing) - 课后笔记
光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing) 课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的 ...
- 计算机图形学GAMES101(十二)光线追踪(基本原理)
我们是怎么解决阴影问题? 当对物体着色的时候,只考虑了像素点自己,没有考虑物体遮挡.所以着色不能解决阴影.那么怎么解决阴影问题呢? 阴影映射(Shadow mapping) 可以使用阴影映射来渲染阴影 ...
- 计算机图形学 实验三 相机、阴影、光照
文章目录 实验3.1 相机定位 一. 实验目的 二. 理论背景 1.各个坐标系 世界坐标系 相机坐标系 模型视图矩阵 ndc坐标系 2. 齐次坐标 3. OpenGL观察变换 三. 实验内容 Look ...
- 计算机图形学笔记 (第一周)
1.计算机图形学:研究通过计算机将物体表示为图形并显示的一门学科. 表示: 将物体表示为图形:造型/建模 显示:将表示后的图形显示出来: 渲染/绘制 2.文字/文本:图形/图像: 图形本质也是一种语 ...
- GAMES101-现代计算机图形学入门-闫令琪 - lecture15 光线追踪3 - 辐射度量学、渲染方程(Ray Tracing 3) - 课后笔记
光线追踪3 - 辐射度量学.渲染方程和全局光照 内容: 辐射度量学 光线传输(Light transport) 反射方程(The reflection equation) 渲染方程(The rende ...
- GAMES101-现代计算机图形学入门-闫令琪 - lecture14 光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) - 课后笔记
光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) 对AABB结构优化来加速光线追踪的速度 均匀网格(Uniform grids) 空间划分(Spatial part ...
- 计算机图形学笔记十三:Ray Tracing3(辐射度量学,渲染方程)
辐射度量学,渲染方程 1.辐射度量学(Basic Radiometry) 1.1基本属性 1.2辐射强度(Radiant Intensity) 1.3辐射照度(Irradiance) 1.4辐射亮度( ...
最新文章
- 数据库 大数据访问及分区分块优化方案
- 计算机的学生该怎么做?
- 新手搭建阿里云FTP服务器
- 03-25实验一、命令解释程序的编写
- 20155222 2016-2017-2 《Java程序设计》第10周学习总结
- apache shiro jar包_只需要6个步骤,springboot集成shiro,并完成登录
- 爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)
- java 方块_哈工大java实验 移动小方块
- 读书 | 数字化转型的道与术(上)
- R文件报错:cannot resolve symbol ‘R’
- 设备文件BSP及嵌入式驱动开发笔记
- Hough检测直线原理及c++代码
- mac虚拟机哪个好用 mac双系统和虚拟机哪个好
- “变态”的JavaScript——JavaScript的发明人--布兰登·艾奇(Brendan Eich)
- 如何在亿级数据中判断一个元素是否存在?
- C#利用JScript自动计算字符串公式方法
- python如何模拟微信扫码登录_python 微信扫码登录故障解决
- ccf公共钥匙盒python_CCF/CSP 公共钥匙盒
- hbase倒序查询_Hbase 查询Scan速度优化
- 将picpick汉化及矩形截屏
热门文章
- 超多水分(没写错),教你三步点赞100000+
- 在AI宇宙中流浪的他们,在一张海报中收获了“懂得”
- Htmlunit获取页面cookie的用法
- access数据库使用水晶报表(PUSH)推模式实现多数据源含子报表的订单打印
- MSTAR-DIB,IBitmap,IDisplay,IDispCanvas,IFont,IImage等
- 如何重新排列pdf的顺序?
- 不要再担心旅游景点英语翻译问题啦
- 记一次台式机安装centos7的问题
- pytorch-学习笔记-Sequential函数
- sql 累计占比_制作有累积和占比的销售统计表