2016-10-26 10 views
0

私は、単純なフラグメントシェーダにオープンGL ES2:フラグメントシェーダの最適化

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の呼び出し).Thisは十分ではありません取得全体のシーン。
このコードをどうにか最適化することはできますか?ターゲットの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); 

} 
+0

についての素晴らしい記事を書いていますが、あなたが高速移動するコードでヒープメモリ(新PointF(...))を割り当てることがないようにしてください。任意のプログラミング言語、任意のプラットフォーム、任意の日に移動します。 – Andreas

+0

フラグメントシェーダの排水性能であるかどうかをテストする一般的な方法は、2x2のビューポートを設定することです。それを行い、何が起こるかを見て、結果を伝えます。 – Andreas

答えて

0

フラグメントシェーダを呼び出します。

どのハードウェアを使用していますか? このシェーダを使用するたびにこのシェーダを再コンパイルしていますか? どのようにこのシェーダーを呼び出していますか?

AppleはGLSL最高prectices https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.html

+0

描画コードを追加しました。私のプログラムをコンパイルしてonSurfaceCreated内で一度リンクしました。問題はシェーダの複雑さではなく、問題はオーバードロー領域(画面領域の約1.5)です BTW:コメントのコードですか? – undefined

+0

私はsamsung galaxyタブa6 – undefined

+0

でテストしていますあなたのコードは良く見えません。 android GPUプロファイラを使用して、GPUが実際にボトルネックになっているかどうかを確認できます。このページをご覧ください。 https://developer.android.com/studio/profile/dev-options-rendering.html –