在前面讲了下GPU的几何体和显存宽带方面的优化,这里在谈谈GPU的Light和其他一些优化准则吧!

进入主题:

   首先在这里我会简单介绍相机的几种Rendering Path,然后在介绍常用灯光在相机的不同渲染路径的效果!

Rending Path:

      Vertex Lit 顶点照明 

      顶点照明渲染路径通常在一个通道中渲染物体,所有光源的照明都是在物体的顶点上进行计算的,由于所有的光照都是在顶点层级上计算的,此渲染路径不支持大部分的逐像素渲染效果:如,阴影、法线贴图、灯光遮罩、高精度的高光。另外:顶点照明渲染路径是最快的渲染路径并且有最广泛的硬件支持(然而,请记住:它无法工作在游戏机上)。

 Forward 正向渲染 

       在正向渲染中,影响物体的最亮的几个光源使用逐像素光照模式。接下来,最多有4个点光源会以逐顶点渲染的方式被计算。其他光源将以球面调和(Spherical Harmonics)的方式进行计算,球面调和技术计算很快但只能得到近似值。根据以下的规则判断一个光源是否为逐像素光源:

  • 渲染模式被设置为不重要(Not Important)的光源以逐顶点或球面调和的方式进行计算
  • 最亮的方向光源为像素光源
  • 渲染模式被设置重要(Important)的光源为像素光源
  • 如根据以上规则得到的像素光源数量小于质量设置中的像素光源数量(Pixel Light Count),为了减少亮度,会有更多的光源以逐像素的方式进行渲染

用以下的方法渲染每个物体:

  • 基础通道渲染一个逐像素方向光和所有的逐顶点/球面调和光。
  • 其他逐像素光在附加的通道中进行渲染,每个光源都需要一个通道

Deferred Lighting 延时光照

     延迟光照是一种当前最高级的能实现光线和阴影保真的渲染路径 

  • 对于能影响任何物体的光线数量没有上限
  • 完全采用以每像素的方式评估光线,这等于意味着全部将以正常贴图的方式正确的和物体交互
  • 所有光线都能拥有信息缓存
  • 所有的光线都能产生阴影

   延迟光照的优点:

  • 光照的开销与屏幕的光线尺寸成正比,不用担心光线所照射的物品的数量,少量光线等价于廉价的花费
  • 一致性,所有的光线的光照采用按像素为计算分割单位来计算。比如,不会有在大规模三角形情况下光照计算使计算性能发生崩溃的情况发生。

     延迟光照的缺点:

  • 没有实时抗锯齿支持
  • 延迟光照不能处理半透明物体,也不能用在哪些使用前向渲染的物体之上
  • 有限的光照模式支持(Blinn-Phong)。所有光照以同样的方式计算,你不能够在不同的物体上采用完全不同的光照模式
  • 没有对接收阴影特征的支持和对光线遮罩剔除有限的支持

延时光照的需求

  • 需要Unity专业版
  • 显示卡支持Shader Model 3.0(或更高),深度纹理渲染和双面模板缓冲特性。许多2004年后的显卡都支持:如Geforce Fx或更高,Radeon X1300或更高 Intel 965/ GMA X3100 或更高
  • 目前在移动平台不支持。

    当延迟光照生效时,在Unity中发生的渲染过程如下(重点)

  1. 基本渲染:被渲染的对象产生带有深度,法线,和反射量的屏幕空间缓冲
  2. 光照渲染:使用上一步的缓冲计算出光照。结果放入另一个屏幕空间缓存
  3. 最后渲染:物体再次渲染。取来已经计算好的光线和颜色纹理混合在一起,然后再加上环境光以及散射光照。

不能采用延迟光照技术的带阴影的物体在延迟光照渲染完后使用前向渲染路径处理。

Light:

简单了解了相机的几种渲染方式后,我们来谈谈常用的三种灯光:Directional Liht(平行光),Ponit Light(点光源),Spot Light(聚光灯)。然而他们都具有Light Mode(光照模式),auto,Important,Not Important.第二种和第三种分别是像素光源和不是像素光源,但是在这里要注意的是auto,但当在Edit->Project Setting->Quality中设置的像素光源大于已经使用的像素光源,此时的auto才是像素光源,另外还要注意的是只有平行光应该是逐像素(Important)的,其他所有都应该是逐顶点的,当然,这取决于游戏并且像素光源更耗性能!接下来会详细讲解!

 

Deferred Lighting

    当没有任何的灯源,运行结果如图所示:
     
    

     看到没,他完全是按我上面所提到三个过程渲染,当增加一个聚光灯时,如图所示,他使用上一步的缓冲计算出光照结果放入金字塔中缓存,如图所示:


当再增加一个点光源时,同样只在光照渲染中发生变化,定点缓存对象是一个十二面体,增加一个DC,如图所示:

再增加一个平行光,也差不多,增加一个DC,这里就不做演示了!
小小总结:
   尽管Deferred Lighting的优点是你所需求,但是还是要谨慎使用它!
     Vertex Lit  和 Forward :
    不管设置Directional Liht是不是像素光,在这两种渲染路径效果一样;而Ponit Light和Spot Light在不是像素光源和是像素光源且相机的Rending Path 为Vertex Lit 时,批处理才不会受影响(失效),更不会被再照射一次!当会被影响的效果图如下所示:
      
小小总结:
       当你使用平行光倒没什么很需要注意的地方,但如果你使用聚光灯和点光源时,又设置了他们是像素光时,注意相机的Rending Path 最好是使用Vertex Lit,Vertex Lit优缺点请看上面!最好不要使用像素光,因为他很耗性能,只有在特殊情况下使用,比如:车子的前向灯等!
注意:
     如果你在这里使用了LightMapping的话,LightMapping不要使用Realing Time,否则LightMapping失效!需要再强调的一点是:当使用了点光源和聚光灯在LightMapping下,其动态批处理会失效!但是只会被照射一次,也就是被渲染一次!
   
其他优化准则:
  1. Keep the number of materials as low as possible. This makes it easier for Unity to batch stuff. 
    保持材质的数目尽可能少。这使得Unity更容易进行批处理。
  2. Use texture atlases (large images containing a collection of sub-images) instead of a number of individual textures. These are faster to load, have fewer state switches, and are batching friendly. 
    使用纹理精灵(一张大贴图里包含了很多子贴图)来代替一系列单独的小贴图。它们可以更快地被加载,具有很少的状态转换,而且批处理更友好。
  3. Use Renderer.sharedMaterial instead of Renderer.material if using texture atlases and shared materials. 
    如果使用了纹理精灵和共享材质,使用Renderer.sharedMaterial 来代替Renderer.material 。
  4. Forward rendered pixel lights are expensive.
    像素灯光提前渲染的代价是昂贵的。

    • Use light mapping instead of realtime lights where ever possible. 
      尽可能使用灯光映射来代替实时灯光。
    • Adjust pixel light count in quality settings. Essentially only the directional light should be per pixel, everything else - per vertex. Certainly this depends on the game. 
      在质量设置中调整像素灯光的数量。只有平行光应该是逐像素的,其他所有都应该是逐顶点的。当然,这取决于游戏。
  5. Experiment with Render Mode of Lights in the Quality Settings to get the correct priority. 
    反复调整Quality Settings中的Render Mode of Lights来得到正确的优先级。
  6. Avoid Cutout (alpha test) shaders unless really necessary. 
    避免Cutout(透明度测试)着色器,除非是真的需要。
  7. Keep Transparent (alpha blend) screen coverage to a minimum. 
    保持透明(透明度混合)屏幕覆盖范围最小。
  8. Try to avoid situations where multiple lights illuminate any given object. 
    尝试避免多个灯光照亮任何给定对象的情况。
  9. Try to reduce the overall number of shader passes (Shadows, pixel lights, reflections). 
    尝试减少着色通道(阴影,像素灯光,反射)的全部数量。
  10. Rendering order is critical. In general case:
    渲染顺序是非常重要的。通常情况下:

    1. fully opaque objects roughly front-to-back. 
      大致从前往后的完全不透明对象。
    2. alpha tested objects roughly front-to-back. 
      大致是从前往后的透明度测试的对象。
    3. skybox. 天空盒子
    4. alpha blended objects (back to front if needed). 
      透明度混合对象(如果需要就从后往前)
  11. Post Processing is expensive on mobiles, use with care. 
    后期处理在移动平台上是代价昂贵的,请小心使用。
  12. Particles: reduce overdraw, use the simplest possible shaders. 
    例子系统:降低透支,使用尽可能简单的着色器。
  13. Double buffer for Meshes modified every frame: 
    对于每一帧都需要修改的网格使用双缓存:
[csharp] view plaincopy
  1. <span style="font-family:Comic Sans MS;font-size:14px;color:#660000;"><span style="font-family:Comic Sans MS;color:#660000;">void Update (){
  2. // flip between meshes
  3. bufferMesh = on ? meshA : meshB;
  4. on = !on;
  5. bufferMesh.vertices = vertices; // modification to mesh
  6. meshFilter.sharedMesh = bufferMesh;
  7. }</span></span>

Unity优化大全(七)之 GPU-Ligh和其他相关推荐

  1. unity 优化大全

    看到一篇了好文章,虽然中间有些地方有点儿小问题,但是瑕不掩瑜,给赞.原文链接:http://www.jianshu.com/p/1a2b5d045077 最简单的优化建议: 1.PC平台的话保持场景中 ...

  2. Unity优化大全(八)之 GPU-Ligh和其他

    http://blog.csdn.net/u3d_ysj/article/details/48079299 前言:     在前面讲了下GPU的几何体和显存宽带方面的优化,这里在谈谈GPU的Light ...

  3. Unity优化大全(一)之开篇前言

    前言: 学Unity也有一年多了,前段时间花些时间总结优化方面的知识,看了些官网的优化,和几十遍对Unity不同方面的优化的博客以及一些中英文书籍,过程中发现不同的文章对同一个知识点理解完全不同,同时 ...

  4. 【摘录】UNITY优化-有关骨骼数量的上限问题

    [摘录]UNITY优化-有关骨骼数量的上限问题 1.顶点性能 一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(比如,原 ...

  5. Unity3d面向英特尔 x86 平台的 Unity* 优化指南: 第 2 部分

    目录 优化 脚本优化 脚本视锥剔除和协同例程 智能内存管理 缓存频繁使用的对象和组件 使用 Unity 物理系统的最佳实践 禁用完全透明对象 返回至教程第 1 部分: 面向英特尔 x86 平台的 Un ...

  6. 物联网 mysql数据库优化_MySQL数据库优化大全方法汇总-阿里云开发者社区

    随着数据和负载增加,MySQL数据库会日渐缓慢,性能越来越差,用户体验也随之变差,所以数据库性能优化十分紧迫,云吞铺子分享MySQL数据库优化大全: MySQL数据库优化 云吞铺子先模拟一下数据库访问 ...

  7. Unity3d面向英特尔® x86 平台的 Unity* 优化指南: 第 3 部分

    目录 编辑器优化 遮挡剔除 LOD:细节级别 阴影 使用一个摄像头 渲染队列排序 光照贴图 针对复杂模型,使用简单的碰撞器代替网格碰撞器 返回至第 2 部分教程: 面向英特尔® x86 平台的 Uni ...

  8. Unity优化之Graphics相关

    Unity优化之GraphicsCamera相关 // 像素px.分辨率.ppi.dpi.dp(dip) 屏幕尺寸(Screen Size): 屏幕对角线的长度.iPhone5屏幕尺寸为4英寸.iPh ...

  9. Unity台北場優化分享 达哥 讲 Unity优化

    达哥 讲 Unity优化: https://www.youtube.com/watch?v=Cjh5naX8UU8 Unity台北場優化分享 II PPT : https://www.slidesha ...

最新文章

  1. Matlab数据的可视化 -- 柱形立体图
  2. ubuntu, debian 安装redis,设置开机自动启动和密码,允许外网访问
  3. 什么叫做坐标系的平移和旋转.
  4. windows server服务器上部署java+tomcat网站域名配置
  5. 关于Ant与Maven(一)
  6. jvm系列(九):如何优化Java GC「译
  7. Java基础学习——安装JDK
  8. nohup.out文件过大的解决办法
  9. [Beego模型] 三、高级查询
  10. plsql 破解注册码
  11. 运筹系列10:线性规划开源软件GLPK和PyMathProg
  12. 用两个栈实现一个队列用两个队列实现一个栈
  13. android导航栏动画,Android 带Lottie动画的导航栏
  14. 上传文件计算机传输的,电脑文件怎么传输到iPad
  15. 基于路径跟随的纯跟踪算法--差速模型
  16. IP Multicast: MSDP RPF检测详细规则(转)
  17. Android 图片剪切框架 uCrop 简单集成
  18. 服务器 端口映射 dmz,如何使用端口映射功能与 DMZ 主机设置
  19. 三维空间中椭圆的参数方程
  20. 网络广告创意与制作技巧

热门文章

  1. CSS的浮动属性,详细学习指南
  2. 三种求平方根的算法——C/C++
  3. 通讯录的实现(C语言)
  4. 小知识 - 恢复chmod执行权限
  5. 通过Xcodeproj深入探究Xcode工程文件
  6. 程序员mac开发环境配置
  7. 全新第 13 代英特尔酷睿处理器发布,多线程性能提升 41%
  8. ANDROID 绘制 三角形 XML
  9. 微软打印机驱动服务器,无法通过 Windows Server 中的 Windows 更新来安装打印机驱动程序 - Windows Server | Microsoft Docs...
  10. 放大器指标:1db压缩点