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日 / ...
随机推荐
- dos脚本》大神
关于dos命令行脚本编写 dos常用命令另查 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共 ...
- python基础---面向对象的概念
1.面向对象 什么是面向过程?? 将一个复杂单位问题一步步小化,最终只需要完成一个人小的功能就可以了 比如:将大象放进冰箱要几步? 一共三步:打开冰箱,把大象塞进入,关门就可以了 优点:复杂度降低了, ...
- erlang link 与 monitor
erlang设计中,通常会有这样一个需求: 某一个进程必须依赖于令一个进程的概念,在这样的情况下就必须对两个进程之间建立一个监控或者说连接关系,以监听对方的死亡情况. erlang 提供了两个这样的方 ...
- linux执行python的脚本文件,提示提示No such file or directory
在window平台下,写好python脚本文件,迁移到linux平台,赋过可执行权限,执行该sh文件,却提示No such file or directory.ls 了下,确实有该文件,怎么会事呢, ...
- 解决:安装SQL Server 2008 Native Client遇到错误(在Navicat premium新建sqlserver连接时 需要):An error occurred during ...HRESULT: 0x80070422(注意尾部的错误号)
解决:安装SQL Server 2008 Native Client遇到错误(在Navicat premium新建sqlserver连接时 需要):An error occurred during . ...
- python标准库之random模块
Python中的random模块用于生成随机数. 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的 随机浮点数:0<= n < 1.0 1 ...
- Feign源码解析系列-那些注解们
开始 Feign在Spring Cloud体系中被整合进来作为web service客户端,使用HTTP请求远程服务时能就像调用本地方法,可见在未来一段时间内,大多数Spring Cloud架构的微服 ...
- spring boot 项目部署在阿里云上
装jdk, 然后 nohup java -jar xxxx.jar> system.log 2>&1 & lsof -i:9999 kill -9 1234
- alsa音频播放过程中的基本概念
以下为 ALSA-Project/FramesPeriods[1] 学习笔记 1, sample_rate: 即每秒进行多少次采样,常见的比如 8000.16000.44100和48000等 2, s ...
- 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...