【问题标题】:Opengl es 2.0 Custom shader low fps (android)Opengl es 2.0 自定义着色器低 fps (android)
【发布时间】:2012-12-06 22:49:58
【问题描述】:

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

我正在 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 上名为 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循环中执行下面的代码。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多