压缩纹理能够节约不少内存空间,因此目前项目中UI全都是用Texture Packer打包出大图之后压缩。Unity导入纹理的默认设置是compress,在符合条件的情况下会优先使用PVR或ETC、否则会降为RGBA4444。从程序的角度来说,当然是1/4大小的压缩纹理更好啦~但是,毕竟是有损压缩,会带来一定的损失,有时候还是挺郁闷的。

第一个常见的问题是渐变颜色区域经过压缩之后会出现色阶,如下图所示。我参考了dither思路,用Photoshop加了一层0.3%的高斯分布杂音;可以看到ETC和PVR都有所改进,但是仔细盯着看依然能看到一些噪声。

compress texture 1

Read More →

Unity中的烘焙(不管是老的Beast还是新的Enlighten)有一个非常恼火的功能缺失:无法利用Culling Mask。不管是否设置了Baking为Realtime,还是修改了Culling Mask都没有作用,貌似只有整个设置光源物体的Active才有效。

根据论坛说法,5.3会增加这方面功能但后来又说延迟到5.4,反正至今木有看到希望。有鉴于此,参考了Beast lightmap ignores light culling mask and/or layers这个回答里的代码,我自己写了一遍从而实现了烘焙的Culling:

不带Culling 带Culling
unity-bake-default unity-bake-cull
Read More →
分析libunity.so Release崩溃

最近一直在和Crash做斗争,一开始用了Bugsnag相当不错,后来经朋友推荐转用腾讯的Bugly,后台查询简直6。

偶尔发现会遇到libunity.so崩溃,如果是Development模式还好,adb log基本就能看的七七八八;如果是Release模式下就一堆地址,根本没法看。网上搜索了下相关信息,绝大多数都是自己编译的C++代码,利用ndk-stack去分析obj文件。但是对于Unity引擎本身来说,我们手头只有一个libunity.so,无法这么干。

更新: 今天wxp和我聊了下,发现新版本竟然Release直接带符号表了,就不用这么麻烦了…5.3.6 Release Notes里第一条是

Android: Symbols for release libraries are now available in PlaybackEngines/AndroidPlayer/Variantions/*/Release/Symbols.

Read More →
SDF字体

之前一段时间项目到了一个节点,忙于出包和应付渠道,没太多时间业余充电…最近空下来之后终于有空继续折腾KlayGE。这次是把字体部分kfont读了下,感受到了SDF(Signed Distance Field)的厉害之处。

Read More →
Unity UV/2UV相关的一系列坑

昨天和美术折腾了一天,好好的理解了一下Unity里UV/2UV的设置,主要是理解很多程序的概念在美术上的理解是怎么一回事儿…

Read More →

最近在折腾Ocean Simulation,业余时间快搞了半个月了,数学功底太差TAT…

fft_part1

Read More →

最近升级XCode 7之后发现xuporter在Jenkins上跪了,因为默认打开了ENABLE_BITCODE选项会导致编译失败。在代码里加上两句话就能解决:

project.overwriteBuildSetting("ENABLE_BITCODE", "NO", "Release");
project.overwriteBuildSetting("ENABLE_BITCODE", "NO", "Debug");

ps. 理论上第三个参数默认是"all",但是木有用的样子…

Read More →

之前Trace翻译过西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密系列,后来问他要了份Rip,对照着在Unity里山寨了份。

ggx1

Read More →
泰坦黎明效果分析一二

之前在Adreno Profiler工具介绍中提过,对泰坦黎明的效果很感兴趣。现在终于等到安卓版本了,分析了一下它的几个效果,感觉有不少收获:

  • 就硬件来说,很多经验性的性能数据可以更新一下;
  • 就其引擎来说,广告板(Billboard)用的非常之风骚,而且只传顶点、接着在Vertex Shader里拉出面片的思路很赞;
  • 配合美术,用后处理效果提升逼格棒棒的;
  • 整体绘制的还是挺奢侈的,不少地方我觉得用面片能节约非常多。
Read More →

Recently I found an interesting bug with Adreno Profiler: this cannot work correctly with glVertexAttribPointer(indx=2, size=4, type=GL_HALF_FLOAT_OES, normalized=False, stride=32, ptr=0xC). For example, texcoords in half type are presented as strange numbers:

adreno_profiler_half_wrong

Read More →