open gl es2:片段着色器优化

时间:2016-10-26 14:40:38

标签: android opengl-es-2.0 fragment-shader

我有以下简单片段着色器

 precision lowp float;
 uniform sampler2D u_texture_image;
 uniform sampler2D u_texture_mask;
 uniform lowp float u_blink;
 varying lowp vec2 v_texCoords_image;
 varying lowp vec2 v_texCoords_mask;
 varying lowp float v_shadow;
 void main() {
     lowp vec4 color= vec4(texture2D(u_texture_image, v_texCoords_image));
     lowp vec4 mask_color= vec4(texture2D(u_texture_mask, v_texCoords_mask));
     //masking image
     color = vec4(color.xyz,mask_color.a);
     //blink
     color =mix(color,vec4(1.0,1.0,1.0,mask_color.a),u_blink);
     //check if its a shadow
     color=mix(color, mask_color*0.3, v_shadow);
     gl_FragColor = color;
}

我使用此代码4400多边形绘制并获得25 fps(onDrawFrame调用之间约40ms)。这还不够,因为这不是整个场景。
我可以以某种方式优化此代码吗?我的目标fps是30。
我也想知道片段着色器代码是否有一些分析工具?

ADD:如何调用片段着色器

private void drawPieces() {
    //set my shader
    piecesProgram.useProgram();
    //set uniforms
    piecesProgram.setUniforms(MVPMatrix, textureImageId, textureMaskId,new PointF(2f,2f),0f);
    //load my vertcices with glVertexAttribPointer
    piecesMesh.bindPieceData(piecesProgram,false);
    //draw it with glDrawElements
    piecesMesh.drawPieces(false);
    piecesMesh.disableAttributes(piecesProgram);

}

1 个答案:

答案 0 :(得分:0)

这个着色器看起来并不那么复杂。

您使用的是哪些硬件? 你每次使用它时都重新编译这个着色器吗? 你怎么称这个着色器?

Apple写了一篇关于GLSL最佳预告的好文章 https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html