转 自动Shader优化器glsl_optimizer的编译与在cocos2dx中使用

glsl_optimizer是一个免费开源的glsl优化器。可以生成GPU无关的shader优化代码。可以进行非常多的优化项目,比如函数内连,死代码删除,常量折叠,常量传递,数学优化等等。

由于是应用在cocos2dx中,所以有些地方我会在原文的基础上注明一些要注意的地方。方便以后自己使用,也方便其他开发者的理解。

对于移动终端来说,各种手机硬件参差不齐,因此处理一些华丽的glsl来说,效果不佳,掉帧严重。所以为了尽可能的用到华丽的效果,我们有必要对对glsl代码进行优化。

1、尽可能少用for循环,试过很多绚丽的效果,大多都用到次数比较多的循环。曾经我测试过,帧数少的可怜,用惨不忍睹来形容也不为过。

2、尽可能少用高级数学运算,例如sin,cos这些。我的解决办法就是在外部代码先计算好,在传入到着色器文件里。

3、在片源着色器里,尽可能少用全局变量。


GitHub地址为:
https://github.com/aras-p/glsl-optimizer

我们首先需要编译命令行工具。该工具同时支持VS和XCode工程。但是打开工程我们发现 

wKioL1PzWNnhWQCvAAFh0zsfLf8121.jpg


工具作者只提供了一个测试用例和lib的编译target,没有提供命令行工具的target。

好在SIO2作者提供了一套命令行工具代码。我从SDK中扒出来,放到项目里即可。这样我们就能用上最新版本的glsl_optimizer了。

首先复制名为glsl_optimizer_tests的target,并重命名为glsl_optimizer_bin。

wKioL1PzWRiS6u2XAACmxosN2f0359.jpg


然后在当前target中,打入代码文件main.cpp(文件已上传到附件),并移除代码文件glsl_optimizer_tests.cpp的引用。


然后我们要在main.cpp中设置一下要优化的glsl版本。 

1
2
//TODO 请填写你要优化的glsl版本
ctx = glslopt_initialize( kGlslTargetOpenGLES20 );


支持如下参数:

1
2
3
4
5
6
// Optimizer target language
enum  glslopt_target {
     kGlslTargetOpenGL = 0,
     kGlslTargetOpenGLES20 = 1,
     kGlslTargetOpenGLES30 = 2
};


然后我们就可以编译了。
为乐方便,我直接上传了一份二进制文件。

二进制文件下载
编译完成后,我们找到生成的二进制程序。将其和待优化的glsl脚本复制到合适位置。

(这里的意思是把我们写好的顶点着色器文件、片源着色器文件以及编译生成的程序放在一起。并且把顶点文件改名为 vertex.glsl, 片源文件改名为 fragment.glsl。方便执行命令行)


对于如何找到编译的二进制程序,找到products->glsl_optimizer_bin->右键->show in finder。



然后使用命令行: 

1
2
3
. /glsl_optimizer_bin  - in  vertex.glsl -out vertex.glsl -profile GL_VERTEX_SHADER
  
. /glsl_optimizer_bin  - in  fragment.glsl -out fragment.glsl -profile GL_FRAGMENT_SHADER

(这里就是作者为什么要放在一起的原因。我们cd到之前放在一起的文件件,并且执行这两个命令。)

(注意:对于cocos2dx可能会报错,因为有些宏变量是2dx自定义的,glsl_optimizer这个程序没有考虑这些,所以如果遇到这种情况,我们可以先注释掉包含这些宏的代码,等命令执行好后,我们在取消注释。)


来调用工具优化shader,该命令非常好懂,不再赘述。

优化之后的控制台显示为: 

wKiom1PzWc3SLnJ8AAUHJQbEL6I054.jpg

然后将优化后的脚本复制回项目。编译运行即可看到FPS有一定程度的提升。项目越大shader脚本越多,越复杂,优化效果越明显。

这是我用iphone5在cocos2dx里测试的效果。对比的浮动范围在5 ~10帧的范围。所以效果还是很明显的。
 

这是优化后的效果:



本文出自 “老G的小屋” 博客,请务必保留此出处http://goldlion.blog.51cto.com/4127613/1542254

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值