植被风动
全库目录221
本文目录7
树叶随风摇动了,根部也漂走,或者本体在动而影子留在原地,这些都是形变数据没有沿同一规则传递。风动从锚点和权重出发,用相位组织主摆动与细抖动。阴影、深度与运动向量复用同一位置函数以后,画面才会把它们看作同一次运动。
权重与位移
根部、枝条与叶尖
顶点色或UV可保存根部固定权重、枝条弯曲权重和叶片抖动权重。权重定义属于资产契约,制作与着色器使用同一通道约定。根部权重为零时位移也应为零,骨架或地面接点才能保持稳定。
基础正弦摆动可以先验证这条不变量。下面是世界空间HLSL机制片段,windDirectionWS为单位水平向量,anchorWS是实例固定锚点,heightWeight为0–1,振幅使用世界单位。
float phase = dot(anchorWS.xz, spatialFrequency) + instancePhase;
float swing = sin(timeSeconds * angularFrequency + phase);
float3 displacedWS = positionWS + windDirectionWS
* amplitudeWS * heightWeight * swing;取振幅0.2米、权重0.5、正弦值1,顶点沿风向移动0.1米;同一时刻根部权重0,所以位移严格为零。若上一帧正弦为0,当前为1,运动向量必须包含这0.1米形变。把当前时间同时传入两次求值,会错误得到零形变速度,时域重建随后把运动叶片当作静止表面。
该片段是形变模型,尚未在引擎运行。固定锚点计算实例相位,顶点位置随时间变化也不会反过来改变相位。高度权重可用平方或曲线控制弯曲,接近叶尖时再叠加低振幅高频项。
阵风与空间变化
阵风用低频空间场改变振幅和方向。世界采样让邻近树木响应相似风场,实例相位提供局部差异。对象空间采样随模型移动,世界空间采样则需要处理大世界原点移动和时间精度。
位置偏移只改变顶点。弯曲较大时,原法线仍描述静态表面,光照会显得脱离运动;可对形变求导更新切线基底,或使用已知旋转变换同步方向。简单偏移适合小幅摆动,大幅形变要同时设计表面方向。
当位移为 且相位只由实例锚点决定时,沿高度的切向量变为 。这说明只移动位置而保留原法线会失配,也给简单主弯曲提供了解析修正入口。若相位还随顶点位置变化,求导必须同时包含相位导数;复杂枝叶形变应复用同一函数的切线差分或解析导数。
各通道的形变一致性
阴影、深度、本体和描边应使用相同位移函数和参数,运动向量还要用当前与上一帧参数计算两个位置。上一帧时间、风场和锚点需要明确保存;只用当前时间重算两帧,会得到错误运动向量。
包围范围包含最大可能位移,CPU剔除才能保守覆盖动画。LOD和Impostor切换时保持锚点、振幅与相位关系,必要时按屏幕贡献淡化高频抖动。形变参数重置、传送和原点移动时同步处理历史有效性。
验证与成本
先关闭细抖动只看主摆动,检查根部固定;再分别打开实例相位、阵风与法线更新。对照本体、阴影、深度和运动向量,定位出现差异的通道。
风动新增顶点计算和可能的纹理采样,多个Pass会重复执行。记录各LOD、阴影级联、描边和Alpha 裁剪路径,比较实际顶点调用与GPU时间。远景降低高频振幅,检查轮廓闪烁和Alpha覆盖。
相关主题
示例状态:本页代码用于解释对应的数据和调用约束,完整资源创建、类型与调用环境由项目提供。除文中另列的实际实验外,本页未执行目标引擎编译、GPU捕获或性能计时。
参考资料
- Tiago Sousa,GPU Gems 3 Chapter 16: Vegetation Procedural Animation and Shading in Crysis:主弯曲、细节弯曲与植被属性。
- Unity6000.0,Mesh.SetUVs:顶点属性通道契约。
- 本仓库参考模型中的正弦位移为机制示意,完整形变、法线与运动向量需按项目实现验证。