2012-12-06 78 views
3

我正在做一个简单的应用程序/壁纸,它增加了简单的水波纹效果背景图像。Opengl es 2.0自定义着色器低fps(android)

我在HTC Desire(Android 2.2)上测试。

我已经找到了如何做到这一点这样的解释,并实现了它的Android Adrian Boeing: Blog

现在的问题是性能很低。如果我仍然有图像(使用普通着色器),fps大约是40-50fps。如果我添加计算sinc函数的部分,并将纹理fps的新计算值降至20fps。

问题是我要添加不仅仅是1波纹更多和fps由波纹的数滴/ 2(2 t.i涟漪= 10fps的,3涟漪5 FPS等...)。

有我惨实现这个着色器,它有一定空间大大优化,或者是类似这样的效果在一些其他的方式做了什么?

的作用类似于默认的动态壁纸在Android上称为水(秋叶飘落到下面微波荡漾的池塘)。

这里是我的着色器的代码:

private final String fragmentShaderCode = 
     "precision mediump float;" + 
     "uniform sampler2D uTexture;"+ 
     "varying vec2 vTexCoordinate;"+ 
     "uniform float mTime;"+ //time variable 
     "uniform float offX;"+//center of wave 
     "uniform float offY;"+//center of wave 
     "uniform float size;"+//size of wave (so you can make it smaller over time) 
     "void main() {" + 
     "  vec2 off2 = vec2(offX,offY);"+ 
     "  vec2 cPos = -1.0 + 2.0 * vTexCoordinate.xy;" + //bring coordinate to middle of screen 
     "  vec2 ofvec = cPos+off2;"+ //doda offset 
     "  float r = length(ofvec);"+ //length of vector 
     "  cPos = vTexCoordinate + (size)/(r*2.0)*sin(r*100.0-mTime); "+ //sinc function for wave simulation 
     "  gl_FragColor = texture2D(uTexture,cPos);" + //draw texture 
     "}"; 

注:我添加了这个代码,它的简单阅读。使用多个触摸事件的代码只是使用vector作为offX,offY,并在for循环中执行下面的代码。

回答

3

片段着色器中的大量计算严重影响性能。移动OpenGL ES设备优化的常见做法是将繁重的计算转移到顶点着色器。

在这种情况下,您将需要重新考虑着色器的逻辑并修改几何图形。我建议做一个足够好的曲面细分的网格来模拟水波,并改变顶点位置以产生涟漪效应。

或者,您可以将所有逻辑保留在片段着色器中,但使用具有偏移数据的外部烘焙纹理更改UV偏移的计算。这样你就会有相同的效果质量,但性能明显提高。您必须针对给定距离存储单独的纹理烘焙数据以获得UV增量,并从此纹理读取预先准备好的预计算值。所有移动设备GPU都至少有2个纹理采样器,因此额外的texture2D()调用几乎可用。

想知道它是如何工作的,请阅读这篇文章http://prideout.net/blog/?p=56它是关于路径变形,但您应该看看从纹理中采样某些预先计算的数据的方法。