【问题标题】:open gles 2 shader performance打开 gles 2 着色器性能
【发布时间】:2012-07-29 17:22:28
【问题描述】:

我正在用 android 制作游戏,但是颜色太亮了,我无法更改精灵,所以我决定实现一个着色器:

const char* fETCShader = "\
uniform mediump sampler2D sTexture 
uniform mediump sampler2D sTexture_alpha 
\
varying mediump vec4 vColor 
varying mediump vec2 vTexCoord 
uniform lowp mat4 cCorrection 
\
void main()\
{\
    lowp vec4 color = vec4(texture2D(sTexture, vTexCoord).rgb, texture2D(sTexture_alpha, vTexCoord).r) * vColor 
    gl_FragColor = cCorrection * color 
}"

但是 fps 急剧下降(比如 20 )

有谁知道是否有更便宜的操作来做到这一点。

谢谢。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    不用分别使用 3 和 1 通道的 2 个纹理,只需制作单个 4 通道 RGBA 纹理,这样您只需进行 1 次纹理提取。

    手机上的片段着色器很快成为瓶颈。始终尽量减少片段着色器必须执行的工作量。

    您的着色器将如下所示:

    const char* fETCShader = "\
    uniform mediump sampler2D sTexture 
    uniform mediump sampler2D sTexture_alpha 
    \
    varying mediump vec4 vColor 
    varying mediump vec2 vTexCoord 
    uniform lowp mat4 cCorrection 
    \
    void main()\
    {\
        gl_FragColor = cCorrection * texture2D(sTexture, vTexCoord) * vColor; 
    }"
    

    【讨论】:

    • 我们使用的是ETC纹理格式,这种格式只支持RGB通道,所以我们认为我们需要强行添加一个额外的纹理来保存alpha通道并创建向量RGBA,如Shader所示。
    • ETC2 支持 RGBA,看看你能不能让它工作。否则,您可以尝试一些技巧,例如 alpha 值的顶点属性,或者不使用 ETC 压缩。如果您的内存空间有限,请尝试降低纹理的大小或在需要使用纹理时将纹理流式输入和输出。
    • 您好!您能否详细说明“alpha 值的顶点属性”?这是否意味着在顶点着色器中使用 sampler2D 并以某种方式将结果写入变量以供以后在片段着色器中使用?
    • 不,就像顶点着色器中的attribute mediump float alpha,以及片段着色器中的等效varying。您将使用您的位置和 texcoords 发送每个顶点的 alpha 值。
    【解决方案2】:

    你能不能只改变一次精灵,当它们第一次加载时,然后使用你以前使用的任何机制?如果做不到这一点,至少将两种纹理合二为一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 2016-01-22
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多