摘要: 当我尝试为精灵着色时,我会立即降低 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)。所以这不是插值,看起来乘法非常昂贵。就这一个乘法?