14

lwjgl (opengl) を使用して、プレイヤーから遠ざかるにつれてオブジェクトがフェードアウトする単純な 2 次元ゲームの実装に成功しました。このフェージングは​​、当初、プレーヤーから各オブジェクトの原点までの距離を計算し、これを使用してオブジェクトのアルファ/不透明度をスケーリングすることによって実装されました。

ただし、より大きなオブジェクトを使用する場合、このアプローチは少し粗すぎるように見えます。私の解決策は、オブジェクト内のすべてのピクセルにアルファ/不透明度のスケーリングを実装することでした。これは見栄えが良くなるだけでなく、計算時間を CPU から GPU に移すことにもなります。

FBO と一時的なテクスチャを使用して実装できると考えました。
FBO に描画し、特別なブレンド モードを使用して事前に計算された距離マップ (テクスチャ) でマスクすることで、効果を実現するつもりでした。アルゴリズムは次のようになります。

0) opengl を初期化して FBO をセットアップ
する 1) バックグラウンドを標準バッファにレンダリングする
2) カスタム FBO に切り替えてクリアする
3) オブジェクトを (FBO に) レンダリングする
4) 距離テクスチャを使用して FBO をマスクする
5) 標準バッファに切り替える
6) FBO を一時的にレンダリングするtexture (標準バッファーへ)
7) hud 要素をレンダリングする

ちょっとした追加情報:

  • 一時的なテクスチャは、ウィンドウ (したがって標準バッファ) と同じサイズです。
  • ステップ 4 では、特別なブレンド モードを使用して目的の効果を実現します
  • 私の一時的なテクスチャは、最小/倍率フィルターで作成されています: GL11.GL_NEAREST
  • データは以下を使用して割り当てられます: org.lwjgl.BufferUtils.createByteBuffer(4 * width * height);
  • GL11.glTexImage2D( GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, dataBuffer);
  • 私のコードには GL エラーはありません。

これにより、実際に望ましい結果が得られます。しかし、少しパフォーマンス テストを行ったところ、私の FBO アプローチではパフォーマンスが低下することがわかりました。1000 回の連続レンダリングを要求し、時間を測定してテストしました。結果は次のとおりでした。

512x512 解像度の場合:

  • 通常: ~1.7 秒
  • FBO: ~2.5 秒
  • (FBO -ステップ 6: ~1.7 秒)
  • (FBO -ステップ 4: ~1.7 秒)

解像度 1680x1050 の場合:

  • 通常: ~1.7 秒
  • FBO: ~7 秒
  • (FBO -ステップ 6: ~3.5 秒)
  • (FBO -ステップ 4: ~6.0 秒)

ご覧のとおり、これはスケールが非常に悪いです。さらに悪いことに、このタイプの 2 回目のパスを実行するつもりです。私がテストしたマシンは、対象ユーザーの観点からハイエンドであると想定されているため、このアプローチでは 60 fps をはるかに下回ると予想できます。これは、この単純なゲームにはほとんど受け入れられません.

パフォーマンスを回復するにはどうすればよいですか?

4

1 に答える 1

5

Damonとsidewinderguyが提案したように、フラグメントシェーダー(および頂点シェーダー)を使用して同様のソリューションを正常に実装しました。私のパフォーマンスは、最初のcpu-runオブジェクトベースの計算よりも少し優れています。これは、FBOアプローチよりもはるかに高速です。同時に、FBOアプローチに非常に近い視覚的な結果を提供します(重複するオブジェクトの動作は少し異なります)。

興味のある人は、フラグメントシェーダーが基本的にgl_FragCoord.xyを変換し、テクスチャルックアップを実行します。これで最高のパフォーマンスが得られるかどうかはわかりませんが、他のテクスチャを1つだけアクティブにすると、ルックアップを省略してテクスチャ値を直接計算してもパフォーマンスが向上するとは思われません。また、パフォーマンスのボトルネックがなくなったため、必要であることが判明するまで、さらに最適化を待つ必要があります。

また、私が受け取ったすべての助け、提案、コメントにとても感謝しています:-)

于 2011-05-10T07:55:45.660 に答える