GL ES:片段着色器优化

时间:2013-05-24 01:55:34

标签: performance optimization opengl-es-2.0 fragment-shader

要点: 一旦我尝试着色精灵(即:在片段着色器中将纹理与颜色相乘),我就会使FPS减速

详细信息:

硬件:iPod touch 4

使用包含alpha通道的64x64 png纹理,使用glEnable(GL_BLEND)进行渲染。 (带投影的笑脸)

我使用glDrawArrays在屏幕上绘制700个精灵。是的,我正在一次抽奖中对所有这些进行批处理。以下显示了Vertex数据结构:

struct Vertex {
    float Position[2];
    float Color[4];
    float Texture[2];
};

是的我正在为每个顶点发送颜色,因为我有选择地需要为某些精灵着色而不是其他精灵。以下是我正在使用的片段着色器:

varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;

void main(void)
{
    gl_FragColor = texture2D( TextureSampler, TexCoord );
}

直到现在它工作得很好,给我60分FPS !!!

BUT

一旦我将片段着色器更改为以下(允许着色):

varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;

void main(void)
{
    gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}

性能下降到47 FPS只是因为这个单一的变化{只需乘以 ONE 矢量}(使用xcode仪器和OpenGL侦测器测量FPS)。有什么想法发生了什么?

感谢。

修改

我也试过剥离每个顶点颜色属性:

struct Vertex {
    float Position[2];
    float Texture[2];
};

修改片段着色器如下:

precision lowp float;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;

void main(void)
{
    gl_FragColor = texture2D( TextureSampler, TexCoord ) * vec4(1.0,0.0,0.0,1.0);
}

700精灵以52 FPS的速度运行(增益仅为5 FPS)。所以这不是插值,似乎乘法是非常昂贵的。只是这一次乘法?

1 个答案:

答案 0 :(得分:0)

根据我的经验,alpha混合会很快降低帧速率,尤其是在旧设备上。我的猜测是,乘以该颜色实际上涉及GPU的大量额外计算(将帧缓冲中已有的颜色分解和乘以)。老实说,如果你在第四代iPod touch上仍然保持47 fps的速度,那么你的表现似乎相当不错。您可能会在较新的设备上恢复到60。如果您正在对绘制调用进行批处理,那么使用这样一个简单的着色器并没有更多的优化。

您可以尝试渲染目标颜色不会影响最终颜色的所有精灵,使用原始纹理查找着色器作为单独的批处理,然后使用与颜色相乘的着色器绘制其余颜色,但是排序可能不值得。

修改

还有另一个SO答案here可能更符合您的要求。它基本上说片段着色器中更高精度的浮点乘法可以扼杀性能。您可以手动将采样器的精度设置为更低,并以此方式提高性能。