西安金融网站建设,做暖漫画网站,ps免抠素材网站大全,网站源码怎么用2.1 引言
光线从弯曲的表面反射或折射#xff0c;因此只聚焦在受光面上的某些区域#xff0c;于是就产生了刻蚀现象。本文从美学角度出发#xff0c;不以纯物理的方式计算#xff0c;使其很容易在大多数图形硬件上实现#xff0c;效果又十分逼真。 2.2 刻蚀的计算
如果想…2.1 引言
光线从弯曲的表面反射或折射因此只聚焦在受光面上的某些区域于是就产生了刻蚀现象。本文从美学角度出发不以纯物理的方式计算使其很容易在大多数图形硬件上实现效果又十分逼真。 2.2 刻蚀的计算
如果想正确地计算水下的刻蚀是一个复杂的过程这涉及到数目庞大的光线及其相互作用。为了模拟这一过程必须从光源射出光子作为开始一部分光子碰到海面或者反射或者折射。对于折射部分按照Snell折射定律 用该公式编程很不容易可以将公式变形为一个更容易编程的形式例如Foley等人1996年提出的 光子一旦入水后即发生折射并继续前进随着入水的深度增加光强度会衰减最后一些光子会碰到海底并将其照亮。由于海面的波纹经过不同路径入水的光线可能最终照到海底相同的区域每当这个现象发生时在刻蚀中的聚集光线就会形成明亮的光斑类似于透镜的聚光现象。
刻蚀其实可以通过正向或逆向光线跟踪计算。在正向光线跟踪中要跟踪从光源射出并穿过场景的光线累计其在不连续地区的贡献。逆向光线跟踪则以相反的过程工作。它从海底开始按照与入射光线相反的顺序逆向跟踪光线计算给定点的所有入射光线综合。但是无论是正向光线跟踪计算还是逆向跟踪计算都非常费时因为只有极小部分的计算对最终结果有实际意义。
2.3 方法
本文采用的方法是逆向光线跟踪的一个简化。我们只计算到达海底光线的一个子集该子集就是只计算垂直与地面的光线因为那些从入水到碰上海底面传播距离最短的光线才会最容易形成刻蚀。这种方法计算消耗非常少尽管物理上不“”正确“”但是非常逼真。
我们的算法如下。从海底开始绘制海底地面后使用第二次混合叠加渲染来渲染刻蚀。为了这样做我们创建一个与水网格尺寸相同的海底网格并且用刻蚀值对其逐顶点地着色。为了创建光照采用逆向光线跟踪从海底网格的每个顶点垂直地向上发射光线一直到达正好位于哪个顶点之上的水波点。然后使用有线差分计算那个点的海面波的法线。有了矢量和法线使用Sneel公式创建出从水波射向空气的第二级光线。我们再计算每条光线和垂直线的夹角愈靠近垂直的方向那个方向进入大海的光线就越多。
2.4 使用OpenGL实现
使用两个pass第一次渲染使用一个普通纹理渲染还地面。然后第二个pass通过刻蚀算法逐一照亮海底网格的顶点。 2.5 使用高级着色语言实现
先前OpenGL实现中是在CPU上执行的波函数。现在可以采用逐像素法代替逐顶点法全面的提高了视觉质量。
关于法线的计算不像前面提到的使用有线差分方法我们考虑了两种方法他们都使用波函数的偏导产生法线
1.在屏幕空间可以渲染过程纹理当只有小部分像素看的见时这个方法可以节省渲染时间但是也意味着当有很多像素看得见时对每个像素都要做同样多的工作这些大量的工作显然要减小帧率。
2.在纹理空间中渲染一个分辨率固定的渲染目标贴图在纹理空间中渲染能够固定每帧的工作量这是一个优越性但是却丢掉了一个好处不能只渲染看的见的像素了。另外也很难决定使用多大分辨率对当前场景合适。
我们可以进一步优化运算一是使用Snell定律对入射光线的折射二是简单的基于从水面到水底的距离沿着波法线进行的环境映射。结果穿过纹理中心的垂直光线是明亮的而夹角光线则逐渐衰弱。而且深度越大环境反射贴图的相对尺寸越小因为刻蚀会随距离而衰减所以产生的刻蚀也约细。 核心点总结
简化的反向光线追踪光照环境贴图映射