利用SH函数绘制空间中动态物体
2016-04-17 19:51
295 查看
公式
面片上的光照情况:
L=Le+TLL:最终要求的光照值;
Le :直接从光源照射过来的光;
T:光照传播因子;
TL:从其他面片传播过来的光照
球谐光照常用光照模型 1:
L(x,wo→)=Le(x,wo→)+∫Sfr(x,wi→→wo→)L(x′,wi→)G(x,x′)V(x,x′)dwi[1]L(x,wo→):点x处在wo方向上的光密度
Le(x,wo→):物体自身在点x处发出的光线
fr(x,wi→→wo→):表面上x处的BRDF,他将从wi 方向上进入到该点的光反射并变换到wo 方向上
L(x′,wi→):从其他物体上的x′ 处沿wi 方向到达的光线
G(x,x′):两x,x′ (分别属于不同的物体)间的几何关系
V(x,x′):两点x,x′ 间的可见性关系,取值0或1
蒙特卡洛积分
2D点 -> 3D球面点转换:(2arcos(1−ξx−−−−−√),2πξy)→(θ,φ)
近似积分:
∫f(x)dx≈1N∑i=1Nf(xi)w(xi)=4πN∑i=1Nf(xi)
N:采样点数量;
w(xi)权重函数,这里因为均匀随机分布,所以退化为一个常数,大小取决于单位球表面积。
勒让德多项式
勒让德多项式主要属性:(l−m)Pml=x(2l−1)pPml−1−(l+m−1)Pml−2
Pmm=(−1)m(2m−1)!!(1−x2)m/2
Pmm+1=x(2m+1)Pmm
实数球谐函数
通过勒让德多项式得到的球谐函数实部表示如下:yml(θ,φ)=⎧⎩⎨⎪⎪2√Kmlcos(mφ)Pml(cosθ),2√Kmlsin(−mφ)P−ml(cosθ),K0lP0l(cosθ),m>0m<0m=0
其中P为相应的伴随勒让德多项式,K为SH球谐函数的随访因子,如下:
Kml=(2l+1)(l−|m|)!4π(l+|m|)!−−−−−−−−−−−−−−√
由上述参数化表示之后即可以求得蒙特卡洛采样后的球面空间上的球谐函数,其可视化形状一般表示为下图:
球谐投影与重建
对于一个分布于球面空间的函数f(x), 其用球谐函数表示后为f~(x),则 2:f~(x)=∑t=0n∑m=−llcmlyml(s),cml=∫Sf(s)yml(s)ds
对其系数应用蒙特卡洛离散化后得到 3:
cml=∫Sf(s)yml(s)ds≈1N∑j=1Nf(sj)w(sj)yml(sj)cml=4πN∑j=1Nf(sj)yml(sj)
由此便可以对有一个球面空间上的函数进行球谐投影并还原,投影与重建情形如下:
特性:两个函数的乘积在球面空间上的积分值与它们的球谐系数向量组的点积相同。
从而有[^4]:
∫Sf1(s)f2(s)ds≈∫Sf~1(s)f~2(s)ds=ci→⋅c2→=∑i=0Nc1ic2i
四面体剖分线性插值
假设原本点的位置为r⃗ ,对应的重心坐标为λ⃗ ,则有⎡⎣⎢⎢p0x−p3xp0y−p3yp0z−p3zp1x−p3xp1y−p3yp1z−p3zp2x−p3xp2y−p3yp2z−p3z⎤⎦⎥⎥⎡⎣⎢λ0λ1λ2⎤⎦⎥=⎡⎣⎢⎢rx−p3xry−p3yrz−p3z⎤⎦⎥⎥
规则
固定采样点的不足:
如果采样点比较稀疏则对场景的采样就粗略,影响绘制效果,设置得密集则每帧的采样工作计算量大,影响整体计算速度;对于动态场景较容易出现采样点失效的情况;
每帧都必须对所有采样点建立立方体并计算该立方体的球谐系数,在此基础上插值计算所有的面片的光照.
改进方法:
采样点随物体的运动而更新,大大降低了采样点失效的概率;每帧选用合适的采样点进行计算,既保证采样效率又减少了采样工作的计算量;
利用相邻帧的变化较小、每帧可以只更新场景中的一部分物体的光照,将原本大量的计算分散到各帧,提高了效率.
算法
分帧计算:
初始化 :首先对场景进行初始化计算,包括细分面片、建立面片列表和相互对应关系、建立立方体形状因子查找表、设置物体包围盒的8个顶点为人射参考点、设置出射参考点等帧计算:
Step1. 计算到场景边界物体的直接光照.直接光照是具有自我发光能力的物体向外发射出的直接照射到其他物体的光照,为了避免与后续计算重复,此处不计算光源照射到场景内部物体的直接光照,只计算光源到场景边界上的直接光照,并将其记录在每个边界面片的数据结构中.
Step2. 选择一个场景内部的物体,计算它的光照.与以往的方法不同,每一帧都不是计算所有物体的光照,而是有所选择地同时对接收到的直接光照和间接光照进行计算,采用球谐方法并插值.
Step3. 计算所选择的物体对边界的间接光照.场景内部的物体从周围环境吸收能量,再将部分能量反射到环境中去,这部分就是间接光照.将物体视为一个整体发射间接光能量,这个过程和直接光照非常类似.由于计算时每帧所选择的物体一般不同,所以维护每个边界面片接收到的间接光照能量时只更新当前物体对它的影响.
Step4. 绘制场景面片.场景每个面片的光能量包括物体自身拥有的光能量和从其他物体处吸收来的光能量2个部分.将能量值转化为颜色值并绘制.
实现
球谐光照
通过以下变换转换θ,φ到笛卡尔坐标系:cos(θ)=xr
sin(φ)=yrsin(θ)=1
cos(φ)=xrsin(θ)=xy
使用笛卡尔坐标系表示结果如下:
y00(θ,φ)=12⋅1π−−√
y−11(θ,φ)=−12⋅3π−−√⋅yr
y01(θ,φ)=12⋅3π−−√⋅zr
y11(θ,φ)=−12⋅3π−−√⋅xr
y−22(θ,φ)=−12⋅15π−−√⋅yxr2
y−12(θ,φ)=−12⋅15π−−√⋅yzr2
y02(θ,φ)=14⋅5π−−√⋅2z2−x2−y2r
y12(θ,φ)=−12⋅15π−−√⋅zxr2
y22(θ,φ)=14⋅15π−−√⋅x2−y2r2
对于光照方程][1],考虑一个diffuse表面时,各个方向行的反射光线均相同,用一个衡量代替。从而有:
L(x,w0→)=k∫SL(x′,wi→)G(x,x′)V(x,x′)dwi
根据特性][4]可以将L(x′,wi→) 与其他部分分开处理,从而进一步简化模型[5]:
L(x′,w0→)=∫SG(x,x′)V(x,x′)dwi
其中G(x,x′) 也是简单的光线与定点法向量之间的夹角关系,从而计算夹角cos值进行储存即可。
脚注
常用光照模型 ↩球面空间函数的球谐表示 ↩
蒙特卡洛方法离散后的系数表示方法 ↩
相关文章推荐
- 解决Vista系统OpenGL驱动问题的方法整理
- Delphi下OpenGL2d绘图之画四边形的方法
- Delphi下OpenGL2d绘图之画点的方法
- Delphi下OpenGL2d绘图之初始化流程详解
- jquery mobile动态添加元素之后不能正确渲染解决方法说明
- Delphi使用OpenGL2d绘图之画图片Bmp的方法
- Three.js源码阅读笔记(光照部分)
- 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸
- VC运用OPENGL加载BMP纹理图的实现方法汇总
- javascript表格的渲染组件
- 浏览器加载、渲染和解析过程黑箱简析
- java实现OpenGL ES纹理映射的方法
- java基于OpenGL ES实现渲染实例
- OpenGL坐标系介绍
- 【翻译】安卓opengl ES教程之四——添加颜色
- linux下opengl的安装(with qt)
- OpenGL超级宝典笔记——显示列表
- OpenGL超级宝典笔记——顶点数组
- OpenGL生成轮廓
- OpenGL超级宝典笔记——性能比较