图形学 Lecture7 光线追踪
关键:Whitted-Style Ray Tracing
光线追踪和光栅化是两个不同的成像方式。
引入光线追踪
在于光栅化的问题:
- 光栅化不能很好的表示全局的效果。
- 光栅化做阴影很困难
- Glossy reflection问题:光线多次反射
- 间接光照:光线多次反射
光栅化:实时的
光线追踪:速度慢,但是精确
关于光线的假设:
- 光线是直线
- 光线之间不会发生碰撞
- 光线从光源最终到达眼睛(也可以认为眼睛可以发出感知光线可以到达光源,即光路的可逆性)
怎么做光线追踪
一般做法
光线投射(Ray Casting)
过程(光线投射->怎样生成不同光线):
》》》从照相机出发 穿过平面的每一个像素到达物体上的某个点,此点再与光源连线,若不在阴影中,则光源到此点,再到照相机,为一条有效光路(即可以计算能量,算出颜色,即所谓着色)
例子:
怎么投射光线:
- 一根光线可以打到好多个物体上,但我们只考虑光线和场景中物体最近的一个交点。
(这一点就解决了深度测试的问题) - 然后这个点往光源连一条线,看是否在阴影中。
- 对于这一点,有了法线,入射方向,出设方向,就可以着色,着色后就可以写回image中对应像素的值。
Whitted-Style Ray Tracing
上述的方法,仍然是只考虑光线弹射一次。因此,引入Whitted-Style Ray Tracing(是一种递归的算法)
做法:
- 光线投射:(考虑反射 折射)
- 着色:计算每个弹射点的着色,然后相加。
1. 如何求交点
如何求光线和物体表面的交点:
光线定义:
光线:一条射线,有起点o和方向d
沿着光线的每一个点都可以用r(t)来表示 (t表示时间)
(1) . 如何求光线和球的交点:
(即点即在光线上 也在球上)
求t ?(t是大于等于0的)
(2) . 推广到光线和一般隐式表面的交点?
隐式表面都有各自的表达式,直接带入方程求 t 即可。交点即为o+t d
(3) . 光线和显式表面的交点?
即为光线和三角形求交。
属性:
对于一个封闭的平面来说,若光线与其有奇数个交点,则光源在物体内;若有偶数个交点,则光源在物体外。
如何做光线和三角形求交?
对于每个三角形都判断是否与三角形有交点,并找出t最小的这个交点。
光线和三角形求交延伸为两个问题:
- 光线与三角形所在平面是否有交点。
- 此交点是否在三角形平面内。(叉积判断)
解决第一个问题 光线和平面的交?
平面的方程如何定义:
由一个法线和一个点决定一个平面。
如上图:一个平面即为所有p点的集合,此p点构成向量与法线垂直。
求出 t 并保证 t 大于等于0
如何判断上面求出的点是否在三角形内:
用叉乘。
如何简化:即直接算出三角形和光线的交点。
用Moller Trumbore算法 (MT算法):
交点一定在射线上 也一定在三角形内,则可用重心坐标来描述。
光线和显式表面求交如何加速:
之前说,可以对每个三角形都求出交点,然后找t最近的交点,但是太慢了。复杂度是像素个数*三角形个数,甚至还有光线多次弹射增加的次数。
包围盒(Bounding Volumes)
如果光线与包围盒没有交点 那与物体也不可能有交点。
二维:
三维:
长方体:三个对面形成的交集。
常用:Axis-Aligned Bounding Box (AABB) (轴对⻬包围盒)
那光线如何与包围盒求交呢?
二维下:(两个对面)
对于竖直的两条线 对于水平的两条线
然后求两条线段的交集
三维情况下:(三个对面)
对于三个对面,光线进入了三个对面,则光线进入盒子;(进入时间找 最大值)
光线从任何一个对面出来了,则光线离开盒子。(离开时间找 最小值)
if tenter<texit(进入时间 < 离开时间) 则有交点;反之,无交点。
- 离开时间小于0 则盒子在光线背后。
- 如果离开时间是正的 进入盒子时间是负的。
则光线起点就在盒子里。 则光线与盒子一定有交点。
总结: 光线和AABB有交点,当且仅当 进入时间小于离开时间 且 离开时间大于等于0。
为什么要用横平竖直的盒子,即AABB的包围盒。
- 光线和与坐标轴平行的面求交点好求。
上面是随便一个平面,下面是与坐标轴平行的平面。
假设下图的两个对面是与 yz平面平行的一个平面,即该平面与x轴垂直。求到达平面的时间t,只需用op距离除以do的距离。
图形学 Lecture7 光线追踪相关推荐
- 14、计算机图形学——whited-style光线追踪
一.为啥需要光线追踪 以往的Blinn-Phong光照模型在渲染场景时,对于光的漫反射和镜面反射都只会计算一次,但是实际上在一个场景里面,光有可能既存在反射也存在折射,而且,反射次数和折射次数并不只是 ...
- 用JavaScript玩转计算机图形学(一)光线追踪入门
系列简介 记得小时候读过一本关于计算机图形学(computer graphics, CG)的入门书,从此就爱上了CG.本系列希望,采用很多人认识的JavaScript语言去分享CG,令更多人有机会接触 ...
- 计算机图形学(光线追踪)
笔记:光线追踪 Why Ray Tracing? Ray-Tracing Algorithm(光线追踪算法) Basic Ray-Tracing Algorithm Whitted-Style Ray ...
- 计算机图形学--实时光线追踪
实时光线追踪 光线追踪的应用场景 实时光线追踪的算法和传统光线追踪在算法本身上并没有什么差异.而是硬件上的突破让速度更快. RTRT关键的技术是降噪 下图的降噪后的效果 工业界对于实时光线追踪的降噪是 ...
- 计算机图形学【GAMES-101】11、渲染前沿技术介绍(双向路径追踪BDPT、MLT、光子映射、实时辐射度、外观建模)
快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...
- PS5 发布,揭秘真假难辨的虚拟和现实
作者 | 硬核云顶宫 责编 | 伍杏玲 封图 | PS5官网 出品 | CSDN(ID:CSDNnews) 每一个代游戏主机让现实世界的玩家向虚幻的游戏宇宙迈出一步,从任天堂红白机上的魂斗罗,到PS平 ...
- 预览速度提升30倍,这是什么黑科技?(天猫618之3D渲染篇)
简介: 天猫618宣布的 3D 购物时代,相信有很多小伙伴好奇,这背后有哪些"黑科技"?橙子从以下三点为你揭秘--3D实景复刻.3D渲染.3D算法,上周讲了<天猫618宣布开 ...
- php怎么加一个透明的菜单栏,window_PHP制作下拉透明菜单,下拉透明菜单
script language= - phpStudy...
PHP制作下拉透明菜单 下拉透明菜单 var mmenus = new Array(); var misShow = new Boolean(); misShow=false; var mi ...
- 用C# Bitmap作为画布写个3D软渲染器
文章目录 Recoards 记录 图元光栅 Bitmap.SetPixel优化成LockBits/UnlockBits指针操作 Blend Projection 投影 Wireframe 线框 Sci ...
最新文章
- 预告:Javascript全栈开发的系列文章
- centos 6 上安装l7 filter尝试过滤xunlei
- Windows 驱动发展基金会(九)内核函数
- java 相对路径 文件读取,Java相对路径读取文件
- python编写命令行框架_python的pytest框架之命令行参数详解(上)
- SageMath安装及使用
- c语言编程入门文库,C语言程序设计入门:计算机和编程语言
- POJ3980 取模运算【水题】
- 博客开通了-里面有秘密哦
- IEEE754标准浮点格式
- WPF 入门教程打印控件
- 身为程序猿——谷歌浏览器的这些骚操作你真的会吗
- atr指标 java算法_关于股指期货的SAR、CCI、BIAS、ATR指标的算法
- Opencv各个模块功能详细简介
- python从云端服务器读数据_云服务器简单实现Python自动运维
- 真正的手机密码大全!
- 8除以2表示什么意思_8除以2等于4表示什么
- 约瑟夫环 -- 丢手绢问题
- Java核心技术卷阅读随笔--第3章【Java 的基本程序设计结构】
- 用python对股票进行可视化分析_股票分析 | 用Python玩玩A股股票数据分析-可视化部分...
热门文章
- 石溪分校 计算机研究生专业,纽约州立石溪分校 - 985本科申请纽约州立大学石溪分校计算机研究生容易吗?要准备什么?还有如果成功了好毕业吗??...
- 【python】numpy.percentile()函数
- 头的各个部位示意图_牛肉的部位图解与做法+牛肉各个部位分布图及质地简介...
- java 正整数类型_Java 整数类型
- 6、编写应用程序,计算两个非零正整数的最大公约数和最小公倍数,要求两个非零正整数从键盘输入。
- 语音信号短时时域分析
- 【centos】安装wget------转发自【小姜dot】
- python写打飞机游戏
- 接入微信自定义版交易组件3.0,小程序对接视频号操作说明
- 盘点40个最佳项目管理工具大全