为什么单个Vec4乘法会慢慢减慢我的ogl es 2片段着色器?

时间:2011-04-01 02:21:13

标签: iphone ipad opengl-es

我正在为iOS设备编写2D OpenGL游戏。现在,我正在关注iPad(第一代)的表现。该游戏具有ogl 1.1和2.0的代码路径,我可以使用#define来切换正在使用的代码路径。

使用ogl 2.0时,探查器告诉我,我的渲染器利用率%是相当稳定的100%,我的帧率约为30 fps。当使用ogl 1.1时,探查器告诉我,我的渲染器利用率%是~60%,帧率是60 fps。

我想用ogl 2.0提高性能,并且填充率有限,我怀疑片段着色器。这是正在使用的片段着色器:

precision highp float;
uniform vec4 u_color;
uniform sampler2D u_sampler0;
varying vec2 v_texCoord;

void main()
{
    gl_FragColor = u_color * texture2D( u_sampler0, v_texCoord );
}

您可以看到着色器非常简单。它只是将几何颜色乘以纹理颜色。作为一个实验,我删除了乘法,因此输出颜色只是纹理颜色,如下所示:

precision highp float;
uniform vec4 u_color;
uniform sampler2D u_sampler0;
varying vec2 v_texCoord;

void main()
{
    gl_FragColor = texture2D( u_sampler0, v_texCoord );
}

使用此修改后的着色器对代码进行分析,渲染器利用率%为~60%,帧速率为60fps,与ogl 1.1代码路径的性能相同。

我的问题:

1)片段着色器中的简单Vec4乘法是否应该对性能产生如此大的负面影响?

2)我听说它说在ogl es 2设备上,1.1功能是用着色器实现的。显然,这些着色器能够有效地实现我想要的效果(将geom颜色混合到纹理颜色中)。如何在我的ogl 2着色器中有效地实现此效果?

1 个答案:

答案 0 :(得分:7)

着色器比内置ES1.1着色器慢的原因是您要乘以4个高精度值(Float32),而不是4个低精度值(固定点,-2到2)。

uniform vec4 u_color更改为uniform lowp vec4 u_color,您应该会看到与ES 1.1相同的效果。