摘要: 离线渲染中,通常可以用kd,ks,kt(分别代表物体的漫反射系数,镜面反射系数,透射系数)来简单地描述一个物体的基本材质,例如,我们将一个物体设置为:kd=0,ks=0.1,kt=0.9,即代表一束光击中该物体表面后,其中的90%发生透射(折射),另外10%被表面反射回来。这代表了无论光线以何种角...阅读全文
posted @ 2014-10-11 17:08 星光下的守望者 阅读(15151) 评论(0) 编辑
摘要: conference room:纯漫反射场景,只用了一个面光源,采样数为8000 spp。sibenik cathedral:场景中有不少glossy面,同时光源采用的是一个室外的天光,由于光源的光只能通过窗户等少数几个地方进入室内,整个场景主要是靠间接光照明的,这也导致了最终结果噪声比较大。采样数...阅读全文
posted @ 2014-03-15 17:45 星光下的守望者 阅读(750) 评论(0) 编辑
摘要: 最近做了Ward BRDF的实现,相对于之前的lambert,phong来说,Ward是一个真正意义上的各向异性BRDF,但同样的,Ward模型也是一个基于经验的模型,并不是物理上正确的。它由ward本人于1992年在《Measuring and modeling anisotropic reflection》一文中首次提出,到目前为止它已经是图形学中广泛应用的一种BRDF了。有不少文章专门讲述了Ward的理论与实现,其中比较著名的是Bruce Walter在2005年写的《Notes on the Ward BRDF》,该文章从理论到实现都讲了一遍。我在做Ward实现的时候就主要参考了这篇.阅读全文
posted @ 2014-02-27 23:55 星光下的守望者 阅读(4075) 评论(3) 编辑
摘要: 之前一直在考虑这样一个问题,在实际生活中的光源都是有体积的,但是图形学中,很多时候我们用简单的点光源,面光源,或者方向光来模拟实际生活中这些光源,势必会产生一些误差,同时导致很多效果不好做。那么在离线渲染中要怎么对不规则光源进行渲染呢?首先很容参考的是之前我用path tracing模拟环境光照的例子(http://www.cnblogs.com/starfallen/p/3520021.html),即给光源所包含的所有三角面加上一个发光属性,然后直接使用path tracing渲染场景,当从视点发出的ray击中这些三角面中的一个时,认为成功找到一条有效路径。这个方法是可行的,只是效率实在太.阅读全文
posted @ 2014-01-16 20:15 星光下的守望者 阅读(1978) 评论(0) 编辑
摘要: 之前的渲染框架只支持点光源和面光源,所以很难模拟自然环境光的渲染,于是现在简单地加入了一个类似environment map的环境光照的渲染。实际上环境映射(environment mapping)在实时渲染中经常被用到,主要用来模拟光滑表面对周围环境的反射,如镜子、光亮漆面的金属等等。但环境映射有两个很强的假设:1.所有入射光都来自无限远处;2.被渲染的物体必须是凸的,不能有自反射。这两个条件在实际中是很难达到的,当然这是在实时渲染框架下的限制。在光线跟踪引擎下,我们可以轻松地突破这两个条件,当然代价就是效率的降低。在path tracing中,我们还可以对漫反射表面进行环境映射积分,从而.阅读全文
posted @ 2014-01-14 23:49 星光下的守望者 阅读(663) 评论(0) 编辑
摘要: 这段时间一直在看Metropolis Light Transport(简称mlt),现利用这篇博文把之前看资料已经coding上的一些体会记录下来。1.Before MLT 在MLT算法被提出之前,最热的GI算法bidirectional path tracing虽然对比于basic path tracing已经有了效率上的明显提高,但是对于复杂场景的表现力仍显不足。那时候人们已经知道基于path的GI算法的效率关键在于找到有效路径的效率。先说有效路径是什么,简单地说就是从光源出发,在场景中反弹数次最终到达视点的过程中的一系列点和边。但是要想找到一条有效的路径并不是简单的事情,来看看早期的经.阅读全文
posted @ 2014-01-07 23:44 星光下的守望者 阅读(1185) 评论(0) 编辑
摘要: 最近因为研究需要,回顾了一下BDPT,主要看VEACH的那篇论文,同时参考了pbrt,mitsuba的实现,自己写了一份新的bdpt实现。以前实现的那一份BDPT不是基于物理的,而且无法处理镜面和透明物体。这次这个完全按照VEACH论文实现,应该是没有这些问题了。不过一些BUG是改得我很头疼,到目前也还没有完全搞定。brdf的部分不太熟悉,很多地方也不知道是不是实现正确了。总之先这样吧,留下几张最近的渲染结果在这里。还有很多需要改进的地方,不过今天先到此为止吧。(注:图片中模型来源于网络)阅读全文
posted @ 2013-11-19 23:04 星光下的守望者 阅读(778) 评论(2) 编辑
摘要: 本来说等把课程作业做完再来弄这个,但是还是没有忍住,先做了,主要原因还是这个算法很容易实现。这个算法在1997年由Keller首次提出。虽然名字叫Instant Radiosity,但是它和Radiosity还是有很大区别的,主要表现为Radiosity是确定性的算法,而Instant Radiosity是一个随机算法。再说该算法的思想,就是从光源像场景透射出很多粒子,与场景中物体发生碰撞后,就在碰撞点处创建出虚拟点光源(VirtualPointLight),利用这些VPL来近似模拟间接光照,思想十分简单。下图形象地展示了整个算法过程:对于图中的这个室内场景,先求出它的直接光照结果图(左边两.阅读全文
posted @ 2013-07-14 23:47 星光下的守望者 阅读(1429) 评论(0) 编辑
摘要: PM算法看了这么久,也该是到了总结的时候了。自己实现的是PPPM(Probabilistic progressive photon mapping)的一个简化形式。之所以是简化形式是由于我的光子搜集时半径r是恒定的,所以不能得到无偏的解,同时搜集方式使用的是固定圆收集,而非KNN方式。整个算法是以光子图可视化来做的渲染,由于没有做Final Gathering,图片上会有低频噪声,这使得图片看起来会比较脏。另一个问题是噪声控制也做得不好,没有采用MCMC算法来控制光子的发射,光子发射时的采样也是完全随机的,不过对于完全漫反射场景加入了光子的视锥体裁剪和背向面裁剪,这算是一种拒绝性采样了吧。下.阅读全文
posted @ 2013-07-12 07:27 星光下的守望者 阅读(1105) 评论(0) 编辑
摘要: 在说体散射之前有必要先说说渲染方程(Rendering Equation),这个著名的方程是kajiya在1986年提出来的,其基本形式为:这其中Lo(x,w)表示是在点x及出射角度w上的出射光强度,Le表示在点x及出射角度上的自发光强度,随后的一段积分则表示从外部环境中各个方向上到达点x的光强的总量。通俗地说就是:"场景中某一点的光强等于该点的自发光强度(一般光源才有自发光)加上从场景中其他点通过反射(折射)到达该点的光强"。渲染方程描述了光能在场景中的流动过程,而之前的各种全局光照和局部光照算法都是对该方程的一个近似求解。渲染方程的出现标志着全局光照的发展进入一个全新的阅读全文
posted @ 2013-06-09 18:23 星光下的守望者 阅读(1207) 评论(0) 编辑
摘要: 在前一篇文章中提到了光子映射算法具有高效,扩展性好,能轻易捕捉到各种光照效果(比如Monte Carlo ray tracing不易捕捉到的SDS路径),但是它也存在很多问题,比如它本身是一个有偏的算法,boundary bias和topological bias通常能造成肉眼可见的artifact,这主要表现为灰暗的墙角,错误的颜色辉映以及漏光等现象。 针对这一问题,Havran等人在05年提出了以搜集光子射线代替搜集光子本身来解决boundary bias,该方法在采样点切平面上创建一个圆形区域,经过此区域的photon ray将被搜集到,但是为了高效地进行photon ray gath.阅读全文
posted @ 2013-05-22 13:10 星光下的守望者 阅读(2913) 评论(0) 编辑
摘要: 在真实感渲染的领域,除开PT系列算法(pt,bdpt,mlt等)外,还有一个很重要的算法,就是光子映射(photon mapping)算法,这是一种统计上有偏的离线渲染算法。PT系列算法是统计无偏的算法,但是它们最大的问题是在面对SDS路径时求解的低效,所谓SDS的典型就是一个焦散光斑经过镜面反射到眼睛里,而光子映射在这方面相对而言是有比较大的优势的。PM最早由Jensen于1996年引入,它是一个two-pass的全局光照算法,第一步从光源发射若干光子到场景空间,经过N次的发射或者折射直到光子被吸收,或者逸出场景。在漫反射表面记录下光子的每次碰撞数据,组成一个全局光子图(镜面则不需要,因为.阅读全文
posted @ 2013-05-08 22:55 星光下的守望者 阅读(4132) 评论(6) 编辑
摘要: 由于之前在各种场合看到别人贴出的bloom特效做的图片,一开始还以为是用的HDR技术,后来一研究才发现绝大部分都仅仅是一个bloom特效而已,遂打算学习一番。其实bloom是一个非常简单的后期图像处理过程,之所以称其为图像处理过程,是因为它是一种可以在图片生成完毕后再使用的后处理过程。那么它到底是什么样的一种过程呢?简单地说就是:Step1. 先对图片每一像素点进行一个亮度值检测,若大于某一个阈值就保留其原始颜色值,否则置为黑色;Step2. 对上一步结果做高斯模糊;Step3. 将模糊后的图片和原图片做一个加权和(权值视具体情况而定);这里面涉及到的几个关键知识点有必要简单地说一下:1.所谓阅读全文
posted @ 2013-04-07 23:24 星光下的守望者 阅读(1633) 评论(3) 编辑
摘要: bidirectional pathtracing算法是继pathtracing算法以来的又一个突破。因为经典pathtracing算法有一个很大的问题就是效率极低,每个像素点发出的每个path必须击中光源才会对该像素点的颜色值有所贡献,否则这整条路径都是无效的(对目标颜色值没有任何贡献),所以当光源很小的时候,pathtracing算法渲染的场景一般都很黑,并且噪点严重。还有一种特别的情况,就是光源被遮住的时候,整个场景主要由间接光照明的时候,pathtracing算法的效果也十分差劲,bidirectional pathtracing针对经典pathtracing算法的这些问题,不仅从视点阅读全文
posted @ 2013-04-04 12:39 星光下的守望者 阅读(2070) 评论(0) 编辑
摘要: 一般的纹理映射虽然可以添加精致的表面细节,但它无法影响物体表面的光照细节,因此不适合模拟粗糙表面。生成物体凹凸表面的一个简单的方法是对其表面法向量添加扰动,影响光照效果,这种技术又称凹凸映射(bump mapping)。同一般的纹理映射一样,凹凸映射也需要一张纹理图,但这张图通常是灰度图,存放的也仅仅是像素的高度信息。实际产生效果的时候是通过计算凹凸图中相邻像素的高度差值来改变表面法向量的值。如下图:左边是凹凸图的一部分,右图则显示出各像素点间的高度差值(用向量表示),这个向量有很多种计算方式,不同的方法精确度不同,但是选择什么方法要取决于你所要求的精确度是个什么层次。最通常的方法是分别计算.阅读全文
posted @ 2013-03-29 17:18 星光下的守望者 阅读(4431) 评论(0) 编辑