android - Opengl es 2.0 自定义着色器低 fps (android)

标签 android performance opengl-es-2.0 glsl fragment-shader

我正在制作一个简单的应用程序/壁纸,为背景图像添加简单的水波纹效果。

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

我找到了关于如何完成并为 android 实现它的解释 Adrian Boeing: Blog .

现在的问题是性能很低。如果我有静止图像(使用普通着色器),则 fps 约为 40-50fps。如果我添加计算 sinc 函数的部分,而不是使用新计算的纹理 fps 值下降到 20fps。

问题是我想添加的不仅仅是 1 个波纹,而且 fps 下降/2 波纹数(t.i 2 波纹 = 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 
        "}"; 

注意:我添加这段代码是为了便于阅读。使用多个触摸事件的代码,只对 offX,offY 使用向量,并在 for 循环中执行下面的代码。

最佳答案

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

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

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

要了解其工作原理,请阅读这篇文章 http://prideout.net/blog/?p=56这是关于路径变形的,但是你应该看看从纹理中采样某些预先计算的数据的方法。

关于android - Opengl es 2.0 自定义着色器低 fps (android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754055/

相关文章:

android - 单击按钮时播放声音的最有效方法

javascript - 如何减少 0(n) 以找到求和特定值的对的第一个实例

linq - 在任何情况下,LINQ 的 .Where() 会比 O(N) 快吗?

ios - 解除绑定(bind) Open GL ES 纹理的正确方法?

iphone - 我应该使用什么 OpenGL ES 纹理格式才能在 iPad 上获得更好的动态范围?

android - 将 Android 构建发送到 codenameOne Buildserver 时出错

java - if(pause == null) { 不起作用

android - 循环遍历Android View 的所有 subview ?

c# - 优化 Entity Framework 6 并减少往返

textures - OpenGL ES 2.0 : Texture renders black, 几个小时没有解决:(