高效真实的云渲染算法

2023-11-01

高效真实的云渲染算法 【转】

原文链接 : http://www.cnblogs.com/effulgent/archive/2008/10/06/1305029.html

原文:

Realistic and Fast Cloud Rendering
NinianeWang
MicrosoftCorporation(nowatGoogleInc.)
niniane@ofb.net
November11,2003

    最近在网上看到很多云渲染的效果图,但很多人吝于向人分享经验知识,我不是很赞同这种想法,本来就是属于别人的知识,自己有幸学习得到就应该拿出来分享。 废话不多说了,这篇文章中所述的方法正是微软飞行模拟2004采用的方法,也是CRYSIS中云的实现方法,当然CRYSIS中有更多改进。感谢我前同事 提供原论文。

 

                              傍晚的云彩

   云是构成室外场景的重要元素,这篇文章将讲述利用在粒子上赋予纹理的方式来近视各种形态的云彩,而且即使在漫天乌云的情况下也能得到非常理想的运行效率,在光照着色方面我们给予美工最大的控制权,利用美术资源来获取理想的光照效果,而不是传统的利用简单光照模型计算得到,这样对于最终效果可控性会更强.同时我们还将讲述模拟云彩群聚和分散的效果。

    真实的云彩能让室外场景精彩万分,特别是在交互写实的应用中尤为重要,好的云彩系统必须能呈现各种形态各种密度,并且各方向都真实的云,我们的系统必须满足以下几个要求:     1.必须高效,平台应用广泛    2.要能很好的模拟云彩的光照效果    3.云彩需要运动起来才行。

 

传统云彩技术
    很多技术用来对云彩进行建模、动画和渲染。比如最传统的体渲染,利用程序生成的噪声对一个椭球体纹理进行干扰,而着色计算也是基于真实的大气条件,最大的缺点就是不可控,无论是噪声生成的形态还是着色效果,然后就体渲染本身与多边形3D还是有些差别,2者聚合在一起比较麻烦。

如果对体渲染云彩感兴趣的请参考:http://www.vrvis.at/via/resources/course-volgraphics-2004/
Course notes "Real-Time Volume Graphics", Course #28, Siggraph 2004
如果对纯物理模拟感兴趣的请参考:《Real-Time Cloud Simulation and Rendering》By Mark Jason Harris

我们云彩如何建模?

 

 

    我们利用5-400个精灵的ALPHA混合来渲染单朵云彩,渲染时所有精灵都面对相机,聚合在一起形成一个具有3D分布的体积。然后我们需要依照相机距离来从后向前渲染他们,然而如何来建立这些精灵呢?我们选择了一个能给与最终效果更好可控性的方式,传统的程序生成方式,特别是来暴露了许多方程参数的调控让美工痛苦万分,而且并不能所见既所得。我们写了个3DS-MAX插件,它能让美工通过一系列的方盒来近似一个云彩整体形状,美工还能指定之后生成的精灵数量,这样能控制云的浓淡,还能设置生成精灵尺寸范围,生成的精灵大部分是正方形的,当然也会用一些狭长的矩形来模拟云际见最缥缈的部分,通常一个16平方公里的天空会用20-200个盒子来描述云彩外行,而每个盒子根据云彩浓淡又会最终生成1-100个精灵。导出时,插件会首先根据盒子范围、云彩密度等参数,生成一系列的精灵中心点,然后插件会遍历精灵,将距离太近的精力合并消除,这样能很好的提高效率,我们发现这个阀值指定在1/3精灵尺寸时在普通云彩中能得到满意效果,而稠密得云彩则使用1/5~1/6尺寸。导出时,我们需要包含如下信息:精灵位置、尺寸(长宽)、旋转(增加随机性)、纹理以及着色信息(稍后详述)。

我们使用什么样得纹理呢?

 

    我们综合使用(不同数量比例,不同渲染参数,旋转扭曲,拉伸)以上16种云彩纹理来模拟各种截然不同得云彩,这个图时32位带ALPHA通道得.比如使用较多得第4种纹理来模拟底部平坦得积雨云,而第一排得其他3种雾一样得纹理多用来模拟蓝灰色调的稀薄层云,最下两排中饱满膨胀的纹理则多用来模拟堆积云,剩下的纹理则在所有类型的云中都又应用.为了使用有限的16种纹理模拟尽可能多的云彩,我们需要做更多的变换,比如随即旋转,一般的云彩我们让它在0~360范围内随机,而雨云平坦的底部一般使用-5~5度. 

在云中飞翔我们需要做些什么? 

  

    我们的系统将为相机穿梭在云层中提供真实的体验,当相机穿过精灵后,精灵马上从视野中消失,通常这能达到一个完美的效果,但如果相机穿过云层的时候正在做变形动画,可能就会在视觉上有一些不协调的突变。当我们首次实现这个解决方案的时候,我们让精灵作为公告板始终面对相机平面,这样就不会在相机运动过程中明显感觉到精灵的边界,当这样有个很大的缺点,就时当相机离精灵很近的时候,精灵的旋转会非常明显,为了解决这个问题,我们决定当相机距离精灵距离小于精灵半径的一半时,就不再旋转精灵了,这样能很好解决前面提到的精灵旋转问题,但又引进了一个新问题,就是如果精灵旋转被锁定后,如果此时相机旋转观察精灵,此时精灵的边界又会比较明显了,最终我们决定根据相机观察方向与精灵锁定时的方向之间的夹角,来调节精灵的透明度。

云彩如何生成为消亡? 

 

 

   云能自然的生成和消亡将会极大的增加真实性,这里我们通过控制精灵ALPHA程度来完成云彩的演化过程,我们通过精灵在云中的位置来来决定顶点的透明程度,当云形成时,我们首先只渲染位于云中半径一半范围内的精灵,随着时间流逝,慢慢减少他们的透明度,当透明度达到一个阀值时,我们才开始渲染半径一半外的精灵。云彩的消亡过程与此相反,当半径一半之外的精灵基本全部透明后,开始增加半径一半内精灵的透明度,需要注意的是,记得对更外面的精灵使用大一些的透明变化。

云彩如何进行光照着色?
   我们的着色模型中主要又两个控制因子,天光和阳光。

天光的模拟
   现实中,当光线穿过云层时会被云层的粒子散射和吸收,通常在均匀天光条件下,云彩会呈现上白下暗的外观,为模拟这个效果,美工首先定义5个颜色等级,每个颜色等级由一个RGBA颜色和高度组成。 

 

    美工可以使用不同的亮度等级来模拟不同类型的云彩。使用方法见原文。美工还需要定义一个百分比等级来模拟一天不同时段的天光强度,比如中午的天光最强,晚上基本没光了。最后计算流程如下:首先必须完成公告板的旋转,让他们面对相机,还有根据精灵与相机的远近程度将精灵锁定到相关角度,对于每个精灵的顶点,我们取它的高度分量,利用它在高度等级中对天光颜色进行插值,再利用当前游戏时间,插值得到当前天光百分比等级,将两者相乘就得到了顶点得当前时间得天光颜色。

阳光的模拟

 

   太阳会向天空中的云彩投射方向光,特别是再黎明和黄昏,变化的阳光能让云彩更加生动,我们现在将模拟云彩面向太阳光的部分与被向阳光部分的明暗。但我们不模拟云彩之间,云彩自身以及云彩与场景中其他物体之间的遮挡与投影效果。美工再3DSMAX中会指定着色组,通常1~30个精灵为一组,每个BOX都有一个用户属性来指定这个BOX产生精灵所属的着色组,每个组用来模拟现实云彩中的紧密聚在一起的一簇,当我们为一个顶点着色时,首先计算其所属着色组中心到这个顶点的向量,然后再计算所属着色组中心到太阳的向量,将他们正规化后,进行点积,得到一个位于[-1, 1]之间得值,现在我们要将这个值映射到[Cmin, Cmax]之间,[-1, 0]映射到[Cmin, Cmed], [0, 1]映射到[Cmed, Cmax]。这样单位云簇从明到暗就有一个光滑得过渡,而Cmin Cmed Cmax均为亮度百分比,由美工指定,美工还会指定一天中太阳光变化T0->C0 T1->C1,给定一个时间,则顶点得颜色计算为:

C_sun = Func_map(v0*v1) * ( A * C0 + ( 1 – A ) * C1 )        A = (T1 – T) / (T1 – T0)

最终颜色为:

C_vertex = ( C_sky + C_sun ) * C_tex * Alpha_morph 

如何优化性能?
    主要再两个方面,一个时顶点的位置计算和着色计算,第二个时GPU象素填充率 。文中提到使用了顶点信息预计算和八角形环代理纹理方式,这里不再详述,请参看原文。

限制 

   我们的云彩系统因为是体积分布的精灵,所以非常不适合做平面云,如果要做高积云等非常扁平的云,可以直接使用纹理平面.因为所有的粒子再渲染前都做了从后向前的排序,这样才可以得到正确的渲染效果,但当相机移动的时候,很可能导致渲染顺序的改变,这样再视觉上可能会由一些可以察觉的变化,特别是在太阳光分量比较重的黎明和黄昏,但这个问题还没有严重到一定需要解决的地步。还有一些情况与现实不符,比如相机在云彩中间时看到的云比在外面看要更透明,因为有一半的精灵位于相机后面了,而现实并非如此。当相机靠近云层后向下看,因为精灵都被垂直的锁定了,所以我们将会看到大片无云空白,一个建议的解决方案是当相机进入到云彩中心的时候,给世界加上一个额外的雾化来增强云的浓度。到此为止我们的云没有任何的动画,现实中的云一般都会随气流运动变形,我们可以通过旋转和移动云中的精灵来模仿被风扰动的效果,同样我们可以通过透明掉其中部分精灵来改变云的形状等等,因为我们的云没有模拟对光的散射,云彩自身不会投影也不会对其他物体产生投影,还有利用相对与太阳的夹角来评估光照是错误的,应该是根据阳光穿过云层的距离和密度来估算,这样我们就不能得到一些现实中得效果,比如在云层后面观察太阳能看到云得光边。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效真实的云渲染算法 的相关文章

随机推荐

  • 腾讯云16核服务器配置大全_CVM和轻量服务器汇总

    腾讯云16核CPU服务器有哪些配置可以选择 可以选择标准型S6 标准型SA3 计算型C6或标准型S5等 目前标准型S5云服务器有优惠活动 性价比高 计算型C6云服务器16核性能更高 轻量16核32G28M带宽优惠价3468元15个月 腾讯云
  • 组合式API- 1-Setup

    参数 使用 setup 函数时 它将接受两个参数 props context 第一个参数 Props setup 函数中的第一个参数是 props 正如在一个标准组件中所期望的那样 setup 函数中的 props 是响应式的 当传入新的
  • Keil转到Eclipse遇到的几个问题

    ARM下Keil转到Eclipse后的几个问题 Keil转战到Eclipse下 首先 Eclipse的交叉工具链的环境要进行设置 其次 在Keil中的Scatter file在Eclipse下要重新编写 最后 Eclipse的调试环境要进行
  • SQL7 查找年龄大于24岁的用户信息

    描述 题目 现在运营想要针对24岁以上的用户开展分析 请你取出满足条件的设备ID 性别 年龄 学校 用户信息表 user profile id device id gender age university province 1 2138
  • 网络通信TCP/UDP

    目录 1 TCP 通信 cs 模型 socket 函数 bind 函数 listen 函数 connect 函数 accept 函数 recv 函数 send 函数 close 函数 出现的问题解决 2 UDP 通信 sendto 函数 r
  • 10 个基本的 Python 编码约定

    10 个基本的 Python 编码约定 1 使用描述性变量名 2 遵循 PEP 8 标准 3 使用文档字符串记录函数 4 避免全局变量 5 DRY Don t Repeat Yourself 不要重复自己 6 使用列表表达式 7 使用异常进
  • 串口与普通IO口的区别

    General Purpose Input Output 通用输入 输出 简称为GPIO 或总线扩展器 人们利用工业标准I2C SMBus或SPI接口简化了I O口的扩展 当微控制器或芯片组没有足够的I O端口 或当系统需要采用远端串行通信
  • Linux SVN 搭建(YUM)安装

    原文地址 http www centoscn com CentosServer ftp 2014 0202 2409 html 安装说明 系统环境 CentOS 6 2 安装方式 yum install 源码安装容易产生版本兼容的问题 安装
  • 正则验证

    一 校验数字的表达式 数字 0 9 n位的数字 d 2 至少n位的数字 d n m n位的数字 d m n 零和非零开头的数字 0 1 9 0 9 非零开头的最多带两位小数的数字 1 9 0 9 0 9 1 2 带1 2位小数的正数或负数
  • 遍历dataframe中的某列,找出含有空格的元素

    工作上需要处理一个数据 把一个较大数据中的姓名列和账号列全部遍历一遍 然后看是否数据里面含有空格 一开始想法是用for循环 一行一行遍历df数据 这个方法效率太慢 搜索一下 有个博主发现了一个map函数 太厉害了 我直接用了 准备先贴我的代
  • IDEA中POM 项目parent中的dependencyManagement中的依赖版本号报红

    现象 IDEA中作为管理依赖的parent项目的pom文件中 在dependencyManagement中的dependency 如果指定的版本在本地仓库不存在 并且在子项目中也未引用的时候 会报红 疑惑 只是引用了很常见的依赖 并且版本官
  • 如何编写一个含有抄底信号的副图指标

    如果你作为通达信软件源代码的程序维护员 如何编写一个含有抄底提示的副图指标 请看下面的的示例教程 python语言 python 导入所需的库 import talib 计算移动平均线 def moving average data per
  • 【哈佛积极心理学笔记】第6讲 乐观主义

    第6讲 乐观主义 How can we create consciously and subconsciously a positive environment where we actually can take out the most
  • 小白学习一周 Linux命令

    文件系统管理相关命令 clear 清屏 pwd 打印当前工作目录 tmp 打开文件夹 cd 改变当前工作目录 mkdir 创建一个新文件夹 mkdir 在根目录下创建一个新文件夹 mkdir p 套娃创建文件夹 rmdir 删除当前目录下的
  • 图像数据处理 pytorch

    coding utf 8 Transfer Learning Tutorial Author Sasank Chilamkurthy
  • 双非计算机学硕报录比竟然有28:1?深圳大学20考研居然如此爆炸!

    深圳大学是一所双非大学 计算机学科评估B 软件工程学科评估没有 由于计算机实力在双非中很强 而且地处广东深圳 是信息行业和互联网行业比较发达的地区 因此深圳大学很受考生欢迎 但是深圳大学也很难考 深圳大学基本所有计算机相关专业都考408 这
  • 【Git】(一)基本操作

    读完本文后 您会了解 1 如何在本地配置GIT环境 2 环境配置成功后 如何从远端下载一个已有仓库到本地 1 配置全局用户名 邮箱 git config global user name username git config global
  • LeetCode 0198. House Robber

    问题简析 作为职业小偷 我要去打家劫舍 但是注意如果两家相邻房子在同一夜被打劫了 则会触发警报 现在给定一个非负整数构成的数列 代表连续的若干房屋中的财产数量 计算一晚上最多能偷多少钱 例如 nums 1 2 3 1 最大值为1 3 4 n
  • 论文End To End speech里一种seq2seq

    在End To End speech里介绍了一种更好的seq2seq的模型 效果我没有实际比较过 但是思路值得学习 接下来分享下 我的理解 虽然这篇论文讲的是Text To speech 但是主要模型架构使用的是seq2seq 主要的改进也
  • 高效真实的云渲染算法

    高效真实的云渲染算法 转 原文链接 http www cnblogs com effulgent archive 2008 10 06 1305029 html 原文 Realistic and Fast Cloud Rendering N