ftp修改网站,动态Js文件 做网站标题,跨境电商网站建设主管岗位职责,电商管理系统本文部分参照该文章https://zhuanlan.zhihu.com/p/35974789
1.引言
本章介绍了一种灵活的#xff0c;广泛应用的草模拟。该方案渲染的草不仅生长得自然#xff0c;也能够逼真地在风中舞动#xff0c;而且性能很高。
2.概述
首先#xff0c;需要意识到#xff0c;对单个…本文部分参照该文章https://zhuanlan.zhihu.com/p/35974789
1.引言
本章介绍了一种灵活的广泛应用的草模拟。该方案渲染的草不仅生长得自然也能够逼真地在风中舞动而且性能很高。
2.概述
首先需要意识到对单个草叶的细节建模意义不大因为那样大片草地需要的多边形数目会太多。所以我们必须建立一个符合以下条件的简单而有用的替代方案
许多草的叶片必须由少数多边形表示。草地必须从不同的视线看起来显得密集。
而要做到让场景不依赖于摄像机的位置和方向可以把一些草叶组合起来表示在一个纹理中并将多个纹理组合起来且在结果中单个的多边形不应该引起注意。当观察者四处活动时通过将草体加入混合操作或者移除混合操作以在距离范围内增加或删去草体来保证整个草地的渲染效果具有稳定的视觉质量。
3.草体的准备 3.1 草的纹理
草的纹理应该是一些一簇一簇聚集丛生的草否则会出现大片的透明区域。需在透明的alpha通道上画实体草茎。在彩色通道中用深浅不同的绿色和黄色来较好地区别各个单独的叶片也应该模拟不同情况的草叶长得好的和长得差的、老的和嫩的甚至区别叶片的前面与后面。
下图是一个草地纹理的示例。 3.2 草体
对于线性排布如果从垂直于多边形的方向观看场景就会立刻穿帮看出草地多边形的结构是线性排布的。另外这种情况下草地会看起来非常稀疏。只有在摄像机自动导航或者渲染无法到达的远距离草地时才会考虑这样的排布。为了保证独立于当前视线的良好视觉质量我们必须交叉地排布草地多边形。已证明使用星型结构是非常好的。下图给出了“草体”可能的两种变体。
他们由3个相交的方块构成。我们必须禁用背面剔除来渲染多边形以保证双面都可见。为了得到合适的照明度应该让所有顶点的法线方向与多边形的垂直边平行。这保证了位于斜坡上的所有草体都可以得到正确的光照不会因为地形的亮度而出现差异。 如果把这些草地物体彼此相当靠近地设置在一个大的区域里如下图。在运行期间把它们从后向前进行排序使用alpha混合并启用DrawCall中的z-testing/writing那么就会得到自然而茂密的草地渲染效果。 4.草地的动画
关于草地的动画基本思想是以三角函数尤其是正弦和余弦为基础进行计算且计算应该考虑到移动的位置和当前时间、风向和强度。我们的每种技术都只移动草体较高的定点。在一个顶点shader中通过检查纹理坐标区别较高的顶点和较低的顶点是很容易的。对草纹理而言所有的上面顶点应该有相同的v坐标。本文首先实现一个顶点shader的框架在所有的3种动画技术实现方案中都使用该框架只有纯动画的部分有差别。
顶点shader框架如下 动画部分实现起来有几种方法
1每草丛草体的动画Animation per Cluster of Grass Objects。
对一丛靠近的草体上面的多边形顶点统一地发生移动。动画的平移矢量由cpu计算若在cpu上使用更费时的算法还可以让我们利用非常复杂的风模拟。因为每丛草体由它自己的平移矢量来支持所以必须针对每丛草体来改变这个常量因此不得不经常地打断对整个草地的渲染而且为每丛草体使用独立的绘图调用。
优点
复杂的动画计算基于cpu算法进行因为一个多边形上顶点的距离是固定的所以不发生变形。
缺点
需要许多的draw call由于整个草丛的所有顶点同步动画可能出现聚集成簇的现象。
算法
在cpu上计算一个草丛平移矢量为顶点shader把平移矢量设置为一个常量为该单个草丛执行一个drawcal调用顶点shader把平移矢量加到上面顶点的位置
2每顶点的动画Animation per Vertex
为了减少绘图调用我们需要把动画计算移进顶点shader内shader能够相对于它的位置分别的移动每个顶点。如下图所示 因为对每个顶点的移动是分别计算的各顶点移动的距离不再是常数所以可见的变形会出现但是通常这些失真不易觉察。 优点
drawcall很少甚至仅仅1个在顶点的shader中改变顶点位置产生连续的风吹草地引起的波动荡漾不会看出个别的草丛。
缺点
出现变形由于缺少了局部的无序动画可能显得过于均匀动画计算的复杂性受到限制
算法
为顶点shader设定常量例如风的基本强度和方向时间延续性等。为完整的草地或大面积的草场执行一次draw call调用顶点shader在shader中计算顶点位置的动画
3每草体的动画Animation per Grass Object
吸取前两个方法的各自优点我们可以计算动画不是基于每个顶点的位置而是基于草体的中心位置。因为附近的草体现在有不同的动画我们能表现那种要求的局部混乱每个草体内的顶点移动相同又避免了变形。为了做到这一点每个顶点必须知道它所在草体的中心位置。因为顶点shader必须读取这个值所以这个信息所需要的草体位置矢量必须在顶点格式中。
优点
drawcall很少甚至仅仅1个没有变形局部多变画面更自然
缺点
因为每个顶点也包含它的草体的中心位置值所以在顶点格式中需要附加数据动画计算的复杂性受到限制
算法
为顶点shader设定常量例如风的基本强度和方向时间延续性等。为完整的草地或大面积的草场执行一次draw call调用顶点shader以草体的中心位置为基础在shader中计算顶点位置的动画【核心要点总结】
1草的纹理应选取一簇一簇聚集丛生的草。在透明的alpha通道上画实体草茎。在彩色通道中用深浅不同的绿色和黄色区别各个单独的叶片。
2草体的渲染适合进行交叉排布从后向前进行排序使用alpha混合并启用Draw Call中的z-testing/writing便能得到自然而茂密的草地渲染效果。
3草地的动画以三角函数尤其是正弦和余弦为基础且应该考虑到移动的位置和当前时间、风向和强度。实现起来有三种方法
每草丛草体的动画Animation per Cluster of Grass Objects每顶点的动画Animation per Vertex每草体的动画Animation per Grass Object