Unity 中实现粒子系统的 LOD
模型的 LOD 比较简单,直接使用 Unity 提供的组件 LODGroup 挂到模型物体上,然后分别指定不同 LOD 级别的 Renderer 即可。
LODGroup 并不是用距离来控制 LOD,而是用物体在屏幕上的显示范围的高度与屏幕高度的比值来决定物体使用哪一级 LOD。这相当于用物体在屏幕上的面积大小来决定 LOD,避免了不同大小的物体在相同距离上使用相同的 LOD 这一不合理的情况。
如果要提供允许玩家指定物体精细度显示范围的设置,则需要动态修改这个比值。
Unity 没有对粒子系统提供 LOD 功能。如果要对粒子系统做 LOD,我认为可以通过控制粒子的最大数量来实现 LOD,并且参照距离来决定使用哪一级 LOD(因为要计算粒子系统的包围盒,并不是一件容易的事,需要算上所有存活粒子的位置,反而增加运算量)。
粒子特效质量,可以简单的分 3 个质量级别:低中高,以供玩家在设置中选择。每个质量级别在各自定义的一段距离内使用各自定义的一个缩放系数,超出此距离的则线性衰减此系数。使用此系数缩小粒子的最大数量。
// 3 个质量级别下各自最高 LOD 级别的距离百分比(粒子能以此 LOD 级别显示的距离百分比) float[] HIGH_LEVEL_DISTANCE_PERCENTS = { xxx, xxx, xxx }
// 3 个质量级别下各自最高 LOD 级别的粒子数量缩放系数 float[] HIGH_LEVEL_SCALES = { 0.25, 0.5, }
提供一个函数,它可以返回在指定效果质量下指定距离处的缩放系数:
float getParticleCountScale(int level, float distPercent) // distPercent 是个距离百分比,并不是绝对值
{
float highLevelDist = HIGH_LEVEL_DISTANCE_PERCENTS[level];
float highLevelScale = HIGH_LEVEL_SCALES[level];
if (distPercent <= highLevelDist)
{
return highLevelScale;
}
else
{
// 超出最高 LOD 距离的,线性衰减
float factor = ( - distPercent) / ( - highLevelDist);
float scale = highLevelScale * factor;
return scale;
}
}
将这个缩放系数与粒子在预制件中的原始最大数量相乘,得出的新的最大数量再设回给粒子系统即可。
然而美术在预制件里设的粒子的最大数量并不准确,很多时候会设一个粒子在生命周期内不可能达到的特别大的数字,目的只是为了他做效果可以有足够的施展空间。这就需要我们程序自己估算一下粒子的最大数量了。
我估算粒子最大数量的方法是:最大数量 = 生命周期 x 发射速度
Unity 的粒子系统,很多参数(比如这里要用的生命周期和发射速度)都可能是个曲线,这时挑选几个采样点,采样后取平均值吧,毕竟只是估算而已。
有了最大数量(别忘了乘上缩放系数),设回给粒子系统时会发现,maxParticles 其实是个只读属性,没关系,使用反射机制可以修改此值。
// ps 是个 UnityEngine.ParticleSystem 对象
System.Type mainType = ps.main.GetType();
System.Reflection.PropertyInfo pi = mainType.GetProperty("maxParticles");
// newMaxCount 是我们计算出来的新的最大数量
pi.SetValue(ps.main, newMaxCount, null);
Unity 中实现粒子系统的 LOD的更多相关文章
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- 【Unity技巧】Unity中的优化技术
http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...
- Unity中的优化技术
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...
- 关于Unity中LOD和渲染队列----渲染通道通用指令(一)
每个shader里面有很多的subshader,如果所以的subshader都不执行的话就,就执行fallback.每个subshader都可以设置一个LOD,整个shader也有一个LOD. 系统就 ...
- Unity中的Lod
http://blog.csdn.net/bigpaolee/article/details/48521371 LOD是( Level of Detail)的缩写,表示细节级别. 这里注意下,Lodg ...
- 在Unity中高效工作(下)
原地址:http://www.unity蛮牛.com/thread-20005-1-1.html Tips for Creating Better Games and Working More Eff ...
- 如何在Unity中分别实现Flat Shading(平面着色)、Gouraud Shading(高洛德着色)、Phong Shading(冯氏着色)
写在前面: 先说一下为什么决定写这篇文章,我也是这两年开始学习3D物体的光照还有着色方式的,对这个特别感兴趣,在Wiki还有NVIDIA官网看了相关资料后,基本掌握了渲染物体时的渲染管道(The re ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
随机推荐
- Linux命名空间
Linux Namespaces机制提供一种资源隔离方案.PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个Namespace里面的资源对其他Namespa ...
- 基于testng框架的web自动化测试
package baidutest; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.o ...
- cmake jni简说
CMake配置Jni开发 1 安装工具 2 新建项目,注意include C++ support选项 项目创建好后查看目录结构 新增三块.externalNativeBuild:cpp(c.c++代码 ...
- linux下怎么判断网卡速率?
我们都知道ifconfig -a 可以列出所有网卡,但是怎么判读是千兆网卡还是百兆网卡呢? 1. 判断是千兆网卡还是百兆网卡 ethtool ethx 查看支持的速率 实际网卡速率可以看Speed 1 ...
- Echarts 一个开源图表设计工具
一般来说,因有所需,方有所求.最近项目中有这方面的需求,用着感觉不错.特此记录!此处仅是一个简单的demo.官网地址:http://echarts.baidu.com/,相关文档.插件都有. 1.js ...
- 【转】干货 | 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet
虚拟货币钱包 钱包顾名思义是存放$$$.但在虚拟货币世界有点不一样,我的帐户资讯(像是我有多少钱)是储存在区块链上,实际存在钱包中的是我的帐户对应的 key.有了这把 key 我就可以在虚拟货币世界证 ...
- Java 8 Lambda 表达式(一)
Java 8 新特性 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...
- VirtualBox 使用物理硬盘
/******************************************************************************* * VirtualBox 使用物理硬盘 ...
- python-django-01
1.Python工具 - pip 1.作用 Python的软件包管理器,有一些python包被集成到了pip中.只要被集成到pip中的包,都允许通过pip直接安装 2.安装 pip sudo apt ...
- Day8 linux软件包管理
软件包的两种形式 qq.tar.gz (需要编译 源码翻译成二进制)/ rpm (直接安装) rpm的文件名分为5部分 name名称 version版本编号 release发布次数 ...