matlab 光线追踪 渲染,光线追踪(Ray tracing)渲染器工作原理
一.V-Ray 是一款光线追踪渲染器(Ray
tracing)
当前的主流渲染器,如finalRender、Brazil、Maxwell、MentalRay等,都是以光线追踪技术为主的,而V-Ray渲染器图像中的效果主要是通过光线追踪方法计算出来的,所以V-Ray是一款光线追踪渲染器。
二.光线追踪渲染器的工作原理
Ray
tracing工作原理图
我们可以这样理解光线追踪渲染器的工作过程:
1.
渲染图像的组成
假设在相机前面放置一个网格平面,称为视平面(View
plane),网格平面中的每一个小格,就是渲染图像中的一个像素,小网格的多少有渲染输出图像的分辨率决定,如渲染输出图像的分辨率为800X600,则此网格平面就由800X600的小网格组成,如果从相机的位置去看小网格,每一个小网格都覆盖了场景中的一小块区域。可见,如果能计算出每个小网格所覆盖区域的平均颜色,并将此颜色做为小网格的颜色,对小网格进行填充,将网格平面中的所有小格都填充完,也就得到了我们所需要的渲染结果。
2.
如何出计算这些小网格的平均颜色呢?
以相机的中点为起点,向小网格的中点发出一条辅助射线(Ray),此射线与场景中的物体相交(如没有相交,则视为与背景相交),如果计算出此交点的颜色,也就得到了小网格的颜色。
从相机发出的辅助射线与我们的视线方向相同,与场景中物体反射到我们眼晴中的光线的方向相反,故应称为视线,为了方便说明,将此辅助射线,称为采样视线,辅助射线与场景的交点,称为采样点。
采样点的颜色由采样点所在物体的材质、场景中的光源,场景中的其它物体及背景等多方面因素相互作用决定的。
除了需要计算采样点在光源的直接照射下,所产生的颜色外:
如果采样点的材质具有反射属性,则需计算出采样点的反射颜色。
如果采样点的材质具有折射属性,则需计算出采样点的折射颜色。
如果采样点与光源之间有其它物体,则需要计算出采样点的阴影颜色。
如果采样点的周边有其它物体,还需要计算其它物体对此采样点所产生的间接照明效果。
如果开启了焦散效果,还需要计算出采样点的焦散颜色。
如果开启了相机的景深及运动模糊效果,还需要计算出采样点的相关模糊颜色。
将上述采样点的所有颜色综合在一起,就会得到采样点的最终颜色,可见采样点的的最终颜色包含了许多种不同属性的颜色成分。
3.
如何计算采样点不同属性的颜色成分?
3.1 采样点直接照明颜色的求法
从采样点向光线发出采样视线,求出光源与采样点的位置关系,根据光源的亮度、颜色等参数再结果采样的材质属性,就可以求出采样点在光源直接照明下所产生的颜色。
3.2 采样点反射颜色的求法
如果采样点的材质具有反射属性,根据光线的反射原理,此采样点继续发出采样视线,去与场景中的物体相交,我们将新的交点称为二次采样点,求出二次采样点的颜色,就是此采样点反射的颜色。如果二次采样点还具有反射属性,则此采样点继续重复上面的采样计算,直到所规定的反射次数,或反射颜色减弱到一定阀值后终止。
3.3
采样点折射颜色的求法
如果采样点的材质具有透明属性,根据光线的折射原理,此采样点继续发出采样视线,去与场景中的物体相交,我们将新的交点称为二次采样点,求出二次采样点的颜色,就是此采样点反射的颜色。
如果二次采样点还具有透明属性,则此采样点继续重复上面的采样计算,直到所规定的折射次数,或折射颜色减弱到一定阀值后终止。
3.4
采样点阴影颜色的求法
从采样点向光线求出阴影采样视线,如果光源与采样点间有物体遮挡,则根据光源的阴影参数及遮挡物体物属性,就可以计算出采样点的阴影颜色。
3.5
采样点间接照明颜色的求法
采样点间接颜色的求法有两类算法:
3.5.1
视线追踪法
从采样点处,向四周发出采样视线,计算出周边物体对采样点颜色的影响。
3.5.2 光线追踪法
追踪光源所发出的光线,直接计算每个光源对场景间接照明的总结果,然后再求出采样点间接照明的颜色。
3.6
采样点相机景深及运动模糊效果颜色的求法
从相机发出采样视线,求出景深及模糊对采样点的影响,从而求出采样点的模糊颜色。
将采样点的上述颜色求出后,进行综合处理,就会得到采样点的最终颜色。
从上述采样点颜色成分的计算方法中,我们可以看到,所有的计算不外乎使用了二种方法,一是追踪从相机发出的辅助视线,二是追踪从光源发出的光线,而且为了计算,有的需要对采样点进行多次追踪,这就是光线追踪概念的由来。
但是,关于光线追踪的概念是极其混乱及模糊的,下面我就对之进行明确说明。
三. 关于光线追踪(Ray
tracing),光线投射Ray casting)的有关概念说明
由于最先开发出来的追踪算法,由从相机发出的辅助射线为基础的,并将之命名为Ray
tracing,被翻译成中文时称为光线追踪。
后来又开发出来了,追踪光源所发出的光线的计算方法,由于这时Ray
tracing的名称已经被使用,为了与之进行区别,取名为Backwards
Ray tracing,翻译成中文为反光线追踪,明明与光线的光向一致,却将之称为反光线追踪,结果更乱了。
为了区别,后来又对名称进行了修正,将以相机为出发点的追踪称为eye-based
Ray
tracing,基于眼睛的光线追踪;将以光源为出发点的追踪称为light-based
Ray tracing,基于光源的光线追踪。
如果使用直译的方式进行翻译,其名称又烦琐,又不直观,按我的想法:
将 eye-based Ray tracing
翻译成“视线追踪”
将 light-based Ray
tracing翻译成“光线追踪”
即简单、直观,又使人容易理解。
不过在你明白了其算法的原理后,至于称为什么名字,也不是很重要了,一般情况下,将可这二种方法,都笼统的称为光线追踪。
现在再说一说光线投射
Ray casting
如果在进行计算时,仅从相机发出了一次采样视线,直接对采样点进行计算,而对采样点不再继续投射新的采样视线的方法,称为光线投射Ray
casting,其实将之翻译为“视线投射”更为合理。
例如,对场景中漫反射的计算,使用的就是视线投射法。
关于这三种追踪方法,在V-Ray渲染器中都得到了应用。(文章来源于网络)
matlab 光线追踪 渲染,光线追踪(Ray tracing)渲染器工作原理相关推荐
- 转载 调试器工作原理
调试器工作原理--基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关于Li ...
- 调试器工作原理——基础篇
#include <stdio.h>int main(){printf("Hello, world!n");return 0;} 本文是一系列探究调试器工作原理的文章的 ...
- python调试器原理_调试器工作原理——基础篇
本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关于Linux下的调试器实现的主要 ...
- 调试器工作原理系列一: 基础篇
调试器工作原理系列一: 基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关 ...
- 调试器工作原理(1):基础篇
调试器工作原理(1):基础篇 2013/04/15 · IT技术, 开发 · 3 评论 · debugger, ptrace, 代码, 调试器 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定 ...
- (转)调试器工作原理(1):基础篇
本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关于Linux下的调试器实现的主要 ...
- 调试器工作原理之一——基础篇
转自 http://blog.csdn.net/gqb_driver/article/details/13988001 英文原文:Eli Bendersky 翻译:伯乐在线- 陈舸 本文是一系列探究 ...
- Linux下调试器工作原理
Linux下调试器工作原理之一-基础篇 介绍关于Linux下的调试器实现的主要组成部分--ptrace系统调用.本文中出现的代码都在32位的Ubuntu系统上开发.请注意,这里出现的代码是同平台紧密相 ...
- Linux调试器工作原理——基础篇
英文原文:Eli Bendersky编译:伯乐在线-陈舸 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 ...
- javascript原理_JavaScript程序包管理器工作原理简介
javascript原理 by Shubheksha 通过Shubheksha JavaScript程序包管理器工作原理简介 (An introduction to how JavaScript pa ...
最新文章
- Ueditor编辑旧文章,从数据库中取出要修改的内容
- 计算机技术与软件专业技术资格(水平)考试常见问题
- NYOJ 1068 ST(线段树之 成段更新+区间求和)
- MySQL数据库权限管理
- 图片热区map-area
- 怎么增加服务器容量,新睿云服务器硬盘容量怎么增加?
- Java跳出多重循环的方法
- Emulator Error: Could not load OpenGLES emulation library: Could not load DLL!
- 非同质化代币(NFT)概述
- Android实战 - 音心音乐播放器 (开启篇)
- vue3中的tsx写法
- datalist图片九宫显示
- 线性回归与逻辑回归/朴素贝叶斯
- 请java老鸟指教一下
- UI设计师—这个世界上最棒的工作!
- Python——日历模块
- 透过微博回港上市,看中概股如何穿越市场周期变动
- Ubuntu 22.04​下加快rust的编译速度
- 企业服务总线--MuleESB简介
- rest_framework基础