返回介绍

编写着色器时的性能提示

发布于 2021-06-20 00:15:07 字数 2023 浏览 916 评论 0 收藏 0

运用常识;)

只计算您需要的内容;任何实际不需要的内容都可清除。例如,支持每个材质颜色以使着色器更加灵活易用固然很好,但如果总是将该颜色设置为白色,那么在屏幕渲染的每个顶点或像素执行的计算都是无用的。

另外需要注意的是计算频率。通常情况下,渲染的像素(像素着色器执行)个数要比渲染的顶点(顶点着色器执行)个数更多;而要渲染的顶点个数比要渲染的对象多。所以,一般来说,尽可能将计算从像素着色器移到顶点着色器,或者从着色器中完全移出,并在脚本中再次赋值。

较少通用的表面着色器

表面着色器非常适于编写与光照相互作用的着色器。但是,其默认选项是为“一般情况”设置的。在许多情况下,您可以对着色器进行调整,使其运行速度更快,或者至少使其更小:

  • 使用视图方向(即高光)着色器的 approxview 指令采用逐顶点(而不是逐像素)的方式使视图方向规范化。这虽然是近似的方法,但常常取得较好的效果。
  • 用于高光 (Specular) 着色器类型的 halfasview 速度更快。半向量(光照方向和视图向量的中间)将按逐顶点进行计算并规范化。同时,光照函数已将半向量作为参数接收,而不是视图向量。
  • noforwardadd 将使着色器在正向 (Forward) 渲染中仅完全支持一个方向灯。其余灯仍然可以作为逐顶点光源或球谐函数对对象产生影响。这有利于将着色器变小,并且即使存在多个光源,也可以确保它始终在一个通道中渲染。
  • noambient 将在着色器中禁用环境光照和球谐函数光源。这可以使着色器稍微提速。

计算精度

使用 Cg/HLSL 写着色器时,主要有三种基本的数字类型:floathalffixed (以及由它们的向量和矩阵变量,如 half3 和 float4x4):

  • float:高精度浮点。一般为 32 位,正如正规编程语言中的浮点类型。
  • half:中等精度浮点。一般为 16 位,范围是 -60000 到 +60000,精度是 3.3 的十进制数字。
  • fixed:低精度浮点。一般为 11 位,范围是 -2.0 到 +2.0,精度是 1/256。

尽可能使用最低的精度,这对像 iOS 和 Android 一样的移动平台尤为重要。较好的经验法则是:

  • 对于颜色和单位长度的向量,使用 fixed.
  • 对于其他内容,如果范围和精度合适,使用 half,否则使用floatt。

在移动平台上,关键是尽可能确保在片段着色器中保持较低精度。在大多数移动 GPU 上,在低精度 (fixed/lowp) 类型上应用拌合花费较高;同时,在 fixed/lowp 和高精度类型之间进行转换也是相当昂贵的。

Alpha 测试

固定函数 AlphaTest 或与其等同的可编程函数 clip() 在不同的平台上拥有不同的性能特点:

  • 一般来说,在大多数平台上使用它来剔除完全透明的像素是一个小优势。
  • 但是,在 iOS 上发现的 PowerVR GPU 以及某些 Android 设备中,alpha 测试比较昂贵。请勿尝试用作“性能优化”,因为它将变得更慢。

颜色遮蔽图

在某些平台(主要为 iOS 和 Android 设备上找到的移动 GPU)上,使用 ColorMask 删除某些通道(如 ColorMask RGB) )会比较昂贵,因此,请在真正必要时才使用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文