1

摘要: 当我尝试为精灵着色时,我会立即降低 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 !!!

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

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)。所以这不是插值,看起来乘法非常昂贵。就这一个乘法?

4

1 回答 1

0

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

您可以尝试使用原始纹理查找着色器首先将目标颜色不会影响最终颜色的所有精灵渲染为单独的批次,然后使用乘以颜色的着色器绘制其余部分,但排序的开销可能不会值得。

编辑

这里还有另一个 SO 答案,可能是您正在寻找的更多内容。它基本上说片段着色器中更高精度的浮点乘法会降低性能。您也许可以手动将采样器的精度设置为更低,从而提高性能。

于 2013-05-24T02:26:15.253 回答