6

現在ゲームを作成しており、「メニュー」ボタンがクリックされたときに画面を覆うオーバーレイを取得しようとしています.

私が持っている現在のセットアップ:

  • TiledMapRenderer: TMX タイル (背景/マップ) をレンダリングします。
  • SpriteBatch: さまざまなアセット用 (例: プレイヤー画像)
  • ステージ:メニューボタンを押し続ける
  • ShaderProgram: GLSL を使用してオーバーレイ/シェーディング効果を作成する
  • SpriteBatch とマップは ShaderProgram を使用するように設定されています

多くの人が示唆しているように、パフォーマンスのために、私は 1 つの SpriteBatch のみを使用しています。そのため、さまざまなアセットとメニュー ステージの両方で同じスプライト バッチが使用されます。

シェーダーの目的は、暗い/半透明のオーバーレイを追加して画面をグレー表示にすることです。これにより、メニューを開いたときに読みやすくなります。

私が抱えている主な問題は、アセットとメニューが同じ SpriteBatch を共有しているため、同じシェーダーも共有しているため、シェーディング効果を有効にするとすべて(背景とメニュー ボタン) がグレー表示されることです。

SpriteBatch を 1 つだけ使用し、Shader を背景にのみ適用するにはどうすればよいですか (そして、メニュー ボタンを通常/非シェーディングのままにします)?

4

2 に答える 2

9
  • 使用できます: setShader (ShaderProgram シェーダー)

  • シェーダーにロジックを追加してオーバーレイを有効にすることもできます (ユニフォーム、可変属性の読み取りなど)。

  • [推奨]実際のオーバーレイを実際に描画できます。透明度のある小さな灰色のテクスチャ (8x8px) を用意し、背景の後、メニューの前に描画します。メニューと同じように、それは画面座標になりますよね?そのため、複雑さも追加されません (十分な大きさのスプライトを作成します)。

  • [高度] メニューを押したときにゲームが一時停止するようにすると、メニュー ボタンがクリックされたときに画面を FBO にコピーできます。次に、画像を後処理 (暗くする、ぼかす) して、それをメニューの背景として使用できます。これにより、より優れた効果が得られ、ホール シーンの描画が fbo 内で「キャッシュ」されるため、実際にはより効率的になります (ホール シーンを再計算するよりも、単一の fbo テクスチャを描画する方が高速です)。

于 2013-02-25T15:06:10.567 に答える
2

libgdx フォーラムで質問した後、解決策は、シェーダーで強度を設定してから、次のspriteBatch.flush()ものを描画する前にバッチ (つまり )をフラッシュすることでした。

ということで大雑把に…

spriteBatch.start();
//draw stuff
spriteBatch.flush();
// set shader strength/variables
// draw more stuff (is now affected by shader)
spriteBatch.end();
于 2013-02-26T11:13:01.313 に答える