GPU Gems1 - 7 无数波动草叶的渲染

本文部分参照该文章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
  • 由于整个草丛的所有顶点同步动画,可能出现聚集成簇的现象。

算法:

  1. 在cpu上计算一个草丛平移矢量
  2. 为顶点shader把平移矢量设置为一个常量
  3. 为该单个草丛执行一个drawcal
  4. 调用顶点shader,把平移矢量加到上面顶点的位置

2)每顶点的动画(Animation per Vertex)

为了减少绘图调用,我们需要把动画计算移进顶点shader内,shader能够相对于它的位置分别的移动每个顶点。如下图所示:

因为对每个顶点的移动是分别计算的,各顶点移动的距离不再是常数,所以可见的变形会出现,但是通常这些失真不易觉察。

 

优点:

  • drawcall很少,甚至仅仅1个
  • 在顶点的shader中改变顶点位置,产生连续的风吹草地引起的波动荡漾
  • 不会看出个别的草丛。

缺点:

  • 出现变形
  • 由于缺少了局部的无序,动画可能显得过于均匀
  • 动画计算的复杂性受到限制

算法:

  1. 为顶点shader设定常量,例如风的基本强度和方向,时间延续性等。
  2. 为完整的草地或大面积的草场执行一次draw call
  3. 调用顶点shader,在shader中计算顶点位置的动画

3)每草体的动画(Animation per Grass Object)

吸取前两个方法的各自优点,我们可以计算动画不是基于每个顶点的位置,而是基于草体的中心位置。因为附近的草体现在有不同的动画,我们能表现那种要求的局部混乱,每个草体内的顶点移动相同,又避免了变形。为了做到这一点,每个顶点必须知道它所在草体的中心位置。因为顶点shader必须读取这个值,所以这个信息所需要的草体位置矢量必须在顶点格式中。

优点:

  • drawcall很少,甚至仅仅1个
  • 没有变形
  • 局部多变,画面更自然

缺点:

  • 因为每个顶点也包含它的草体的中心位置值,所以在顶点格式中需要附加数据
  • 动画计算的复杂性受到限制

算法:

  1. 为顶点shader设定常量,例如风的基本强度和方向,时间延续性等。
  2. 为完整的草地或大面积的草场执行一次draw call
  3. 调用顶点shader,以草体的中心位置为基础在shader中计算顶点位置的动画

 

【核心要点总结】

1)草的纹理,应选取一簇一簇聚集丛生的草。在透明的alpha通道上画实体草茎。在彩色通道中,用深浅不同的绿色和黄色,区别各个单独的叶片。

2)草体的渲染,适合进行交叉排布,从后向前进行排序,使用alpha混合,并启用Draw
Call中的z-testing/writing,便能得到自然而茂密的草地渲染效果。

3)草地的动画,以三角函数(尤其是正弦和余弦)为基础,且应该考虑到移动的位置和当前时间、风向和强度。实现起来有三种方法:

  1. 每草丛草体的动画(Animation per Cluster of Grass Objects)
  2. 每顶点的动画(Animation per Vertex)
  3. 每草体的动画(Animation per Grass Object)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2003文件服务器迁移2016,服务器2016设置文件共享

服务器2016设置文件共享 内容精选换一换为了保证使用生成的镜像创建的新云服务器可以实现一键式重置密码功能,建议您安装密码重置插件CloudResetPwdAgent,可以应用一键式重置密码功能,给云服务器设置新密码。下载一键式重置密码插件CloudRese…

GPU Gems1 - 8 衍射的模拟

1.什么是衍射 小尺度的表面细节引起反射波彼此干扰,这个现象就是衍射。首先,计算机绘图的大多数表面反射模型都忽略自然光的波动效果。当表面的细节比光的波长(约1um)大许多时,不存在问题。但对于小尺寸的细节&#x…

GPU Gems1 - 9 有效的阴影体渲染

这章全面讲述了用于实时阴影渲染中常见两种流派之一的阴影体(Shadow Volumes)技术,又称模板阴影(Stencil Shadows)技术,重点是得到正确的角度的情形,减少几何图形和填充率的消耗。 简单谈谈阴影…

GPU Gems1 - 10 电影级的光照

本章中介绍了一个的简化的uberlight(可理解为“全能光照”)实现,此光照shader根据Ronen Barzel(1997,1999)提出的照明模型编写而成。而该模型的超集已由Pixar动画开发,并应用于《玩具总动员》、《怪物公司》、《海底总动员》等一系…

GPU Gems1 - 11 阴影贴图反走样

这章介绍了如何通过邻近百分比过滤方法(Percentage-Closer Filtering , PCF)有效减少阴影贴图的反走样,并描述了如何实现一个简化版本,并对PCF方法进行了一定改进。关于阴影贴图和PCF技术的一些链接 https://pubweb.eng.utah.edu…

GPU Gems1 - 12 全方位的阴影映射

在这章中,把阴影贴图的思路扩展到正确处理全方位的(点)光源中,其中包括了实现细节,也涉及到基本硬件能力不足时的低效运行策略。 首先,这篇文章也谈到了在实时计算机图形学中产生可见阴影的两个流行方法是…

GPU Gems1 - 13 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)

这章介绍了一种渲染软阴影的技术,称为遮挡区间映射(Occlusion Interval Maps),能够正确地在静态场景中渲染出光源沿着预定路径移动时产生的模糊阴影。之所以叫遮挡区间映射,是因为此算法使用纹理贴图来存储这种光源可见…

粗糙表面的微表面模型——Physically Based Material

关于文章 Microfacet Models for Refraction through Rough Sufaces的一点笔记,欢迎指正。 BSDF BSDF(Bidirectional Sacttering Distribution Function) 描述了光如何在物体表面散射。如果仅仅限制反射或者透射,BSDF经常被称作BRDF或者BTDF,然而BSDF将…

GPU Gems1 - 14 透视阴影贴图(Perspective Shadow Maps: Care and Feeding)

开篇先说,这文章好难懂啊,到现在也没完全弄明白,有大佬的话欢迎指点。这篇大体意思是对Perspective Shadow Maps进行部分优化。GEMS这书这点是真挺蛋疼,很多文章都是对某项技术的优化,那先介绍介绍原来技术嘛&#xff…

GPU Gems1 - 15 逐像素光照的可见性管理

这章讲到了可见性在逐像素渲染光照场景中的作用,也考虑如何使用可见性减少必须渲染的批次数量,从而改善性能。 假设一个非常简单的场景,一个房间,因为房间的不同部位是不同的材质,所以将其分为8个batch,另…

重建世界坐标

1.概论 在屏幕空间做一些操作的时候往往需要从屏幕坐标和深度纹理中重建出相应的世界坐标。 本文会讨论两种重建世界坐标的方法,并详细讲解第二种方法。 使用VP逆矩阵CameraPosInWorld linearDepth * Direction 2.使用VP逆矩阵法 我们知道屏幕坐标是通过Object…

GPU Gems1 - 16 次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)

这一章,浅墨这篇文章介绍的非常详细,我照扒一遍再稍加一些内容,增加记忆。https://zhuanlan.zhihu.com/p/36499291 【章节概览】 次表面散射(Subsurface Scattering),简称SSS,或3S&#xff0c…

Unity HDRP渲染管线基础指南

HDRP和LWRP简介 Unity2018中引入了可编程渲染管线(Scriptable Render Pipeline,简称SRP),是一种在Unity中通过C#脚本配置和执行渲染的方式。至2018.1版本,Unity中除了默认渲染管线,还提供了轻量级渲染管线…

SSDO AO 图像空间的动态全局光照

本文仅记述SSDO学习笔记! 概述 SSDO Screen-space Direction Occlusion 是对AO的扩充,在AO的基础上,假设没有遮蔽的方向有直接入射光,有遮蔽的方向,可能有间接光的反射。 SSAO理论分析 AO:在计算点的周围…

GPU Gems1 - 17 环境遮挡

环境光遮蔽(Ambient Occlusion)“AO”为Amblent Occlusion的缩写,中文译为环境光遮蔽。在DirectX 10.1 API推出后,Amblent Occlusion升级为SSAO(Screen-Space Ambient Occlusion:屏幕空间环境光遮蔽)&#…

GPU Gems1 - 18 空间BRDF(Spatial BRDFs)

这章主要介绍了空间双向反射分布函数(SBRDF),接着文章讨论了压缩SBRDF表达式,以及由离散光或环境贴图所照明的SBRDF的渲染方法。关于BRDF请参考大佬浅墨的这篇文章https://blog.csdn.net/poem_qianmo/article/details/75943714 S…

浅谈表面反射——波动光学篇

Radiometric Definitions 首先让我们来回忆一下辐射度量学中关于irradiance和radiance的定义: 我们在这里定义光源(source)在x-z平面,因此入射光就可以只用θi\theta_{i}θi​来描述。dAs\mathrm{d}A_{s}dAs​是表面积。定义dΦi\mathrm{d}\Phi_{i}dΦ…

GPU Gems1 - 19 基于图像的光照(Image-Based Lighting)

这篇文章打破了当时立方体贴图环境(Cube-Map Environment)用法的桎梏,深入研究了更多可能的逼真光照效果。文章主要研究了基于图像的光照(Image-Based Lighting,IBL),包括局部化的立方体映射&am…

Polygonal-Light Shading with LTC

概述 如果我们有一个上半球的余弦分布函数(Do)(D_{o})(Do​),并对这个余弦分布函数进行一个矩阵(M)(M)(M)变换,变换为一个新的分布函数(D)(D)(D)。 DMDoD M D_{o}DMDo​ 这就是基本思想:用一个余弦分布函数来拟合出不同的分布函数&#xff…

GPU Gems1 - 20 纹理爆炸(Texture Bombing)

【章节概览】 这章介绍了纹理爆炸(Texture Bombing)和相关的细胞技术,它们能在Shader中增加视觉的丰富性,图像的多样性,并减少大块纹理图案的重复性。 【核心要点】 纹理爆炸(Texture bombing&#xff0…