[Unity] Shader的几种优化方式

优化变量类型

数据类型在定义的时候,应尽量根据自己的需求,分析之后选择一个既能满足开发需求,又能尽量降低由数据大小造成的性能问题。

shader中支持的数据类型:

  • float:高精度浮点值,通常是32位,也是三者中最慢的一个。它对应的还有float2,float3和float4。

  • half:中精度浮点值。通常是16位,范围是-60000至+60000,它适合存储UV坐标,颜色值等,比float类型快很多。它对应的还有half2,half3,和half4。

  • fixed:低精度浮点值。通常是11位,范围是-2.0至+2.0,精度为1/256。这是三者中最小的一个,可以用于光照计算颜色等。它对应的值有fixed2,fixed3和fixed4。

官网对类型的选择,给出了下面的建议:
  • 尽可能使用低精度变量。
  • 对于颜色值和单位长度的向量,使用fixed。
  • 对于其他类型,如果范围和精度合适的话,使用half;其他情况使用float。

共享UV坐标

这步优化很简单,仅仅使用了Main Texture的UV坐标来代替法线贴图的UV坐标,这样实际上减少了内部提取法线贴图UV坐标的代码。这种方法可以很好地简化我们的代码。


减少处理的光源个数

扫描二维码关注公众号,回复: 1106078 查看本文章

这一步优化是通过在#pragma语句中声明noforwardadd值来实现的。这主要是告诉Unity,使用这种Shader的对象,只接受一个单一的平行光光源作为逐像素光源,其他的光源都使用内置的球谐函数处理后作为逐顶点的光源。当我们在场景中放置了另一个光源时,这种策略会很明显,因为我们的Shader使用一个法线贴图进行逐像素的操作。

这样做当然很好,但是如果我们需要不止一个平行光,而且想要控制哪一个是用于该逐像素计算的主光源,又该怎么办呢?这就需要Unity面板中的一个设置啦!如果你仔细观察,就会发现每一个光源都有一个Render Mode下拉菜单。当你点击它时,会出现AutoImportant, 和Not Important三种选项。通过选择Important,你可以告诉Unity这个光源更需要被当成一个逐像素光源,而非一个逐顶点光源。如果设置为Auto,那么就由Unity自己做决定啦!


让Shader只工作在特定的渲染器上


最后,我们在语句中声明了,以便告诉Unity,这个Shader不会再接受来自延迟渲染中的其他任何自定义的光照。这意味着,我们仅可以在正向渲染(forward render)中有效地使用这个Shader,这是在主摄像机的设置中设置的。


文章主要内容来源:

妈妈说女孩子要自立自强--【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader

猜你喜欢

转载自blog.csdn.net/qq302756113/article/details/78929444