我正在制作一个简单的应用程序/壁纸,它为背景图像添加了简单的水波纹效果。
我正在 HTC Desire (Android 2.2) 上进行测试。
我已经找到了关于如何完成并为 android Adrian Boeing 实现它的解释:博客。
现在的问题是性能非常低。如果我有静止图像(使用普通着色器),则 fps 约为 40-50fps。如果我添加计算 sinc 函数的部分,然后使用新计算的纹理 fps 值下降到 20fps。
问题是我想添加的不仅仅是 1 个涟漪,而且 fps 会按涟漪数下降 /2(ti 2 涟漪 = 10fps,3 涟漪 5 fps 等......)。
我是否糟糕地实现了这个着色器并且它有一些空间进行彻底优化,或者这样的效果是否以其他方式完成?
效果类似于 Android 上名为 Water 的默认动态壁纸(秋叶翻滚到下面荡漾的池塘)。
这是我的着色器的代码:
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
"}";
注意:我添加此代码是为了便于阅读。使用多个触摸事件的代码,只对offX,offY使用vector,并在for循环中执行下面的代码。