模型的 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的更多相关文章

  1. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  2. 【Unity技巧】Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  3. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...

  4. Unity中的优化技术

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...

  5. 关于Unity中LOD和渲染队列----渲染通道通用指令(一)

    每个shader里面有很多的subshader,如果所以的subshader都不执行的话就,就执行fallback.每个subshader都可以设置一个LOD,整个shader也有一个LOD. 系统就 ...

  6. Unity中的Lod

    http://blog.csdn.net/bigpaolee/article/details/48521371 LOD是( Level of Detail)的缩写,表示细节级别. 这里注意下,Lodg ...

  7. 在Unity中高效工作(下)

    原地址:http://www.unity蛮牛.com/thread-20005-1-1.html Tips for Creating Better Games and Working More Eff ...

  8. 如何在Unity中分别实现Flat Shading(平面着色)、Gouraud Shading(高洛德着色)、Phong Shading(冯氏着色)

    写在前面: 先说一下为什么决定写这篇文章,我也是这两年开始学习3D物体的光照还有着色方式的,对这个特别感兴趣,在Wiki还有NVIDIA官网看了相关资料后,基本掌握了渲染物体时的渲染管道(The re ...

  9. 关于Unity中的UGUI优化,你可能遇到这些问题

    https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...

随机推荐

  1. Shell 使用 expr 进行数学运算

    1.语法格式: 第一种:expr $num1 operator $num2 第二种:$(($num1 operator $num2)) 2.expr 操作符: 注意:这里比较为true,返回 1.只支 ...

  2. linux之关于学习必备知识

    文件列表的定义: 第一个字符表示文件类型  d为目录  -为普通  1为链接  b为可存储的设备接口  c为键盘鼠标等输入设备 2~4个字符表示所有者权限,5~7个字符表示所有者同组用户权限,8~10 ...

  3. MySQL最基本的概念梳理

    本文根据<MySQL必知必会>(Ben Forta著,2009)整理,基于MySQL4.1-5,可作为深入研究MySQL之前的漱口篇.(基本语句.正则表达式.联结.全文本搜索.增删改查.存 ...

  4. java利用itext导出pdf

    项目中有一功能是导出历史记录,可以导出pdf和excel,这里先说导出pdf.在网上查可以用那些方式导出pdf,用itext比较多广泛. 导出pdf可以使用两种方式,一是可以根据已有的pdf模板,进行 ...

  5. vue 用户停留页面超过30分钟未操作 强制退出到登录页面

    先说下主要实现思路,通过给你的根节点绑定mouseover事件,首先声明下当前时间,每次滑过时记录下滑过的时间,两个时间转化成毫秒数,进行对比,如果超过30分钟,则清除token,跳转到login.h ...

  6. Python中使用多进程来实现并行处理的方法小结

    进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和 ...

  7. 关于jetbrains系列产品2018.1.5以后的使用(crack)方法

    产品请一律官网下载:https://www.jetbrains.com/ 我这里以JetBrains GoLand 2018.2.1为例说明下非付费的使用方法(若资金允许,请点击https://www ...

  8. 学习Mathematica

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2017/12/07 0.杂: Mathematica的自带函数的首字母一定是大写的,参数输入要用中括号[],而不是圆括 ...

  9. s21day19 python笔记

    s21day19 python笔记 一.面向对象的基本知识 1.1 基本格式 # 定义类 class 类名: def 方法名(self,name): print(name) return 123 de ...

  10. ImageUtil

    package com.rscode.credits.util; import java.io.File; import java.io.IOException; import java.util.A ...