ero*_*roy 7 iphone opengl-es ipad
我正在为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 );
}
Run Code Online (Sandbox Code Playgroud)
您可以看到着色器非常简单.它只是将几何颜色乘以纹理颜色.作为实验,我删除了乘法,因此输出颜色只是纹理颜色,如下所示:
precision highp float;
uniform vec4 u_color;
uniform sampler2D u_sampler0;
varying vec2 v_texCoord;
void main()
{
gl_FragColor = texture2D( u_sampler0, v_texCoord );
}
Run Code Online (Sandbox Code Playgroud)
使用此修改后的着色器对代码进行概要分析,得到渲染器利用率%~60%,帧速率为60fps,与ogl 1.1代码路径的性能相同.
我的问题:
1)片段着色器中的简单Vec4乘法是否真的会对性能产生如此大的负面影响?
2)我听说它说在ogl es 2设备上,1.1功能是用着色器实现的.显然,这些着色器能够有效地实现我想要的效果(将geom颜色混合到纹理颜色中).如何在我的ogl 2着色器中有效地实现此效果?
着色器比内置ES1.1着色器慢的原因是您要乘以4个高精度值(Float32),而不是4个低精度值(固定点,-2到2).
更改uniform vec4 u_color为uniform lowp vec4 u_color,您应该看到与ES 1.1相同的性能.