Unity3D培训
美国上市Unity3D培训机构

400-111-8989

VR培训

Unity3D贴图优化实践

  • 发布:Unity3D培训
  • 来源:Unity3D教程
  • 时间:2017-06-14 16:30

目前主流的 Android 机器支持的仅仅是 ETC1 压缩压缩,所以安卓平台我们使用的是 ETC1 RGB 4bit 的压缩方案。

iOS 平台如果使用 PVRTC RGBA 4bit 的压缩方案,显示效果不是很理想,因此 iOS 也是将 alpha 拆出来,使用 PVRTC RGB 4bit 的纹理压缩方案。

这样子每个像素其实就是使用了 8bit 的存储空间,因此压缩比是 0.25(8/32),同时 Android/iOS 平台保持统一,比较好处理。

压缩方案主要分为三个部分,后面会有代码来讲解:

纹理图像 alpha 通道拆分

Shader编写支持 alpha 通道拆分

图片组件重写支持 alpha 通道拆分

纹理 alpha 通道拆分

纹理 alpha 通道拆分其实就是处理每一个像素,将像素的 RGBA 分开成 RGB 和 A 两部分。

在工程中,像素的图片是存储在纹理图片中的,因此拆分后也要存储到纹理图片中。因此拆分的方式有两种:

一种是创建一个新图片,里面填充的是对应原来图片相同位置的 alpha 值;

另一种是将原来的图片加长(或加宽)一倍,多出的部分填充 alpha 值。

一般采取第二种方式,因为同一个图片计算纹理坐标相对来说比较方便。

核心代码如下所示:

【Unity 贴图优化实践】

Shader

Shader 部分的改动比较小, 主要改动的地方就是 Vertex Shader 中的传入参数中会多一个 UV 坐标表示 alpha 通道 sprite 的 UV 坐标,然后在 Fragment Shader 中对 RGB 和 A 进行融合,核心代码如下。

【Unity 贴图优化实践】

uGUI Image 修改

使用 uGUI 的 Image 只会提供一个 UV 坐标到 Shader 中去执行,因此我们需要修改 Image 组件在给 GPU 传递顶点信息的时候计算出 Image 四个顶点 alpha 通道所在的 UV 坐标,给我们的 Shader 传递两个 UV 坐标。

在 Unity 5.x 中我们需要自己实现

protected override void OnPopulateMesh(VertexHelper toFill)。

在 Unity 4.6.x 中我们需要自己实现

protected override void OnFillVBO (List vbo)。

这里可以参考 uGUI 源码来进行适当改动,由于这里的改动较多就不贴出代码出来了,大家自己发挥。

More

如果使用 uGUI,不仅是 Image 组件需要有自己的实现,和 Sprite 有关的组件其实都需要自己来实现,例如 Toggle 等。

另外 NGUI 本人接触不多,但是它也是开源的,因此思路基本上是一致的。

最后还有一个问题是 alpha 通道分离尽量做到编译时候需改图片,替换组件,设置组件先关属性的方式,这样子对其他开发者来说完全无感知,当然这个会给编译时间带去一定的开销。

感谢大家阅读本文章,本文部分文字转载自网络,版权归原作者所有,如有侵权请联系我们进行删除,更多精彩内容请关注Unity3D培训官网

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:U3D教程制作一款3D炸弹超人游戏
下一篇:Unity如何利用Mapbox在游戏中实现真实地图?
选择城市和中心
贵州省

广西省

海南省