Skip to content

Latest commit

 

History

History

Grass

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

草地模拟

基本思路

主要分为模拟与渲染两部分,在模拟部分在形状与运动两方面对草进行建模,从而模拟草的运动,在渲染部分借助曲面细分与几何着色器从抽象的草模型中恢复具体细节。

模拟

对形状建模

将草的形态用四个控制点建模为一个三次贝塞尔曲线[1]



于是可以将草的所有运动建模成控制点属性的改变(法线,位置),此外,控制点还包含了宽度矢量Ew与边矢量Ee,Ew描述了草叶片的宽度与叶面朝向,在随机生成时Ew会绕平行于y轴的直线旋转任意角度,保证叶面朝向的随机性,Ee是从该控制点到下一个控制点的方向矢量,用于与Ew叉积计算法线,也可以通过对贝塞尔曲线求导得到切向量代替。

对运动建模

风的运动被建模为方向矢量与风速标量,将二者乘积称风矢量,为了模拟草的往返运动,令风速标量与正弦函数相乘,将时间差与速度的乘积作为相位差。草的运动则被建模为弯曲(Blend)与摆动(Swing)两部分
静止状态的草:



草在进行弯曲(Blend)运动时,第k个控制点的坐标会围绕第k-1个控制点的宽度矢量Ew旋转一定角度,具体运动的强烈程度取决于草的弯曲惯性系数与风矢量在根控制点法线上的投影长度。
弯曲运动下的草:



草在进行摆动(Swing)运动时,所有控制点的坐标与Ew会围绕过根坐标竖直向上的直线旋转一定角度,具体运动的强烈程度取决于草的摆动惯性系数与风矢量在根控制点Ew上的投影长度。
摆动运动下的草:



  • 在上述两种运动中,前序控制点的运动都会影响到后序控制点,故计算时统一由根控制点往后依次计算。

渲染

四个控制点在渲染阶段要用来恢复草的基本形状,这一部分主要通过曲面细分与几何着色器完成,此外,描绘草的具体轮廓时除了根据根节点Ew插值外,也可以基于一张透明度贴图与Alpha to Converage得到,后者在边缘反走样上处理更好。

曲面细分

曲面细分部分主要是通过风矢量计算出四个控制点的运动,并将四个控制点细分为贴合贝塞尔曲线的多个顶点,用以在几何着色器中恢复几何形状。具体而言,由风矢量计算控制点运动的过程在hull shader中完成,在domain shader中则将细分的多个顶点贴合到贝塞尔曲线上,同时保留Ew与曲线参数t。

几何着色器

由多个顶点恢复草基本形状的工作在几何着色器中进行,一次输入线形式的两个顶点,根据两个顶点的Ew值恢复出正反合计四个三角形片元,并利用曲线参数t插值计算出uv值,交付片元着色器处理。

片元着色器

在片元着色器中先采样一张渐变纹理获取颜色值,再采样透明度纹理获取透明度值,最后将Shader按下述格式修改为使用Alpha to Converage

// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// inside Pass
AlphaToMask On

效果示意图



引用

[1] Lee, Ruen-Rone, et al. "A simulation on grass swaying with dynamic wind force." The Visual Computer 32.6-8 (2016): 891-900.
[2] 利用GPU实现无尽草地的实时渲染