快手Y-tech
最新技术干货分享
摘要
技术拆解
实时水体模拟
图4 一维波动扩散示意图[2]
为模拟水体表面波纹向外扩散的物理现象,一种常见的做法是使用波动公式对水波扩散进行拟合。其中,波动方程是一种二阶线性偏微分方程,主要用于描述自然界中对各种波动现象[3]。一维波动方程将水面近似为若干质量为
使用
根据牛顿第二定律,弹簧作用力对
从而得到一维波动方程:
每帧对水面每个质点进行遍历,根据其受周围四个质点影响计算弹力,从而更新该水面在质点处波动速度和高度:
考虑到水面每个质点的实时状态更新是互不干扰的,我们使用GPU对各质点状态进行并行计算以提高处理效率。我们使用一张纹理图存储水面每个质点的波动状态,并分颜色通道存储波动速度和水面高度。在每帧绘制时,将上一帧水体状态纹理存储到FrameBuffer中,并根据上一帧水体状态纹理调用着色器更新渲染当前帧水体状态。在着色器中,我们依照波动方程,根据当前像素与周围四个像素的水面高度差计算弹力,从而更新水面波动速度和高度。
// 水体状态着色器
float height_avg = (getHeight(uv - dx) + getHeight(uv - dy) + getHeight(uv + dx) + getHeight(uv + dy)) * 0.25;
velocity += (height_avg - height) * VELOCITY_MULTIPLIER;
velocity *= DECAY_FACTOR;
height += velocity;
图7 实时水体高度模拟结果
用户与水体交互
图10 用户与水体实时交互模拟结果
水体渲染
得到水体的实时高度图后,我们的最后一个步骤是根据高度纹理图将水体渲染到屏幕上。凹凸贴图(bump mapping)是计算机图形学的一项常用技术,其在每个像素渲染前预先叠加一个从高度图中采样的扰动,从而使渲染结果表面呈现凹凸感更加真实[5]。
凹凸贴图技术包括高度图、法线图等。我们之前步骤得到的水体高度纹理图即可认为是一张高度图。为增强渲染真实感,凹凸贴图技术根据物体表面高度/法线,改变光线的传播方向从而营造物体表面的凹凸感。在进行水体渲染时,我们引入凹凸贴图技术,通过水体高度图来折射和反射光线,从而实现水体的渲染。
为计算水面波动对折射和反射光线的影响,我们需要计算水面法线,并根据入射光和法线方向计算折射和反射方向。考虑到水体高度梯度越大的地方,其法线偏移也越大,相应地对折射和反射光线角度的影响也就越大。因此我们简化为直接使用水面梯度计算折射和反射光线的偏移,首先计算水体高度图中每个像素与相邻像素间差异得到水体在该位置的梯度,之后根据梯度大小对折射和反射光线的采样uv进行偏移:
vec2 gradient = getGradient(tex_height, uv);
vec4 color_refract = texture2D(tex_input, uv_refract + gradient);
vec4 color_reflect = texture2D(tex_input, uv_reflect + gradient);
此外,为了模拟阳光照射水面产生的高光,我们使用Blinn-Phong光照模型对高光区域颜色进行了高亮处理。为简化光照计算,我们假设入射光从视线一侧斜射向水面,此时依据光照模型水面会在水波左侧产生高光,且该高光在水面坡度最大的区域最为强烈。因此为简化计算,我们依据水体表面梯度方向和大小为水波的左侧添加了高光:
vec4 color_specular = vec4(max(-gradient.x, 0.0));
最后将折射、反射光以及高光进行混合生成最终水体渲染颜色。根据菲涅尔原理,距离水面越近入射角越大折射光强度越大,距离水面越远则反射光强度越大。依据以上原则对折射、反射光进行混合并叠加高光颜色:
vec4 color = mix(color_refract, color_reflect, FRESNEL_FACTOR) + color_specular;
图11 水体渲染结果
总结与展望
后续我们将继续在现有水体技术的基础上,进一步优化水体模拟算法使其更加贴近真实物理结果,同时开发更多新玩法将此类技术更大范围落地。
参考文献
[1] 游戏中的实时水体模拟技术 https://zhuanlan.zhihu.com/p/21573239
[2] File:1D-Wave.gif https://commons.wikimedia.org/wiki/File:1D-Wave.gif
[3] 波动方程 https://zh.wikipedia.org/wiki/波动方程
[4] Müller-Fischer M. Fast water simulation for games using height fields[C]//Proceedings of the Game Developer’s Conference. 2008: 24.
[5] 凹凸贴图 https://zh.m.wikipedia.org/zh-sg/凹凸贴图
你可能还想看
等你来
Y-tech
快手Y-tech部门致力于通过计算机视觉、计算机图形学、深度学习、AR/VR/HCI等多领域的交叉,帮助每个人更好地表达、创作以及互动。Y-tech在北京、深圳、Palo Alto均有研发团队。如果你对我们做的事情感兴趣,欢迎联系并加入我们!
Y-tech长期招聘(全职或实习生):计算机视觉、计算机图形学、UE/Unity开发、技术美术、AI推理引擎、AI工程架构、美颜/特效技术、平台/工具开发、技术产品经理等方向的优秀人才。联系方式:ytechservice@kuaishou.com
Y-tech///