1. ホーム
  2. android

[解決済み] OpenGLのプログラム性能に廃棄は不利か?

2022-02-18 10:55:19

質問

を読んでいました。 これ の記事で、著者はこう書いています。

2つの簡単なステップで、あらゆるプラットフォームで高性能なアプリケーションを書く方法を紹介します。
[...]
ベストプラクティスに従うこと。AndroidとOpenGLの場合、これにはquot;batch draw calls"、"discard in fragment shaders"などのようなことが含まれます。

ディスカードがパフォーマンスに悪い影響を与えるなどということは今まで聞いたことがなく、細かいアルファが必要でないときにブレンドを避けるために使っていました。

どなたか、discardを使用することが悪い習慣と考えられる理由やタイミング、discard + depthtestとalpha + blendの比較について説明していただけませんか?

編集 この質問に対する回答を受け取った後、私は背景のグラデーションをレンダリングし、その上にテクスチャを貼った四角形をレンダリングすることでいくつかのテストを行いました。

  • GL_DEPTH_TEST と " という行で終わるフラグメントシェーダを使用します。 if( gl_FragColor.a < 0.5 ){ discard; } については、以下のようになりました。 32 fps .
  • フラグメントシェーダーからif/discardステートメントを削除すると レンダリング速度が 44 fps .
  • GL_BLEND をブレンド関数 "(GL_SRC_ALPHA.) と共に使用する。 GL_ONE_MINUS_SRC_ALPHA)" の代わりにGL_DEPTH_TESTを使用した場合にも、以下のような結果になりました。 44 fps .

解決方法は?

ハードウェアに依存します。PowerVR ハードウェアや、タイルベースのレンダリングを使用するその他の GPU の場合は discard これは、TBRが、描画されたすべてのフラグメントがピクセルになることをもはや仮定できないことを意味します。この仮定は、TBRがすべての深度(depth)、すなわち、1つのピクセルにつ いて評価することを可能にするため、重要である。 第一 その後、最上位のフラグメントに対してのみフラグメントシェーダを評価します。ハードウェアを除けば、一種のディファード・レンダリング・アプローチです。

アルファテストをオンにすると、同じ問題が発生することに注意してください。