2

私は LibGDX フレームワークに基づいて Android アプリに取り組んでいます (ただし、この問題にあまり影響を与えるべきではないと思います)。透明なスプライトを使用して描画するときに、必要な結果を得る方法を見つけるのに苦労しています。問題は、次の画像に表示されているものと同様に、スプライトが重なっている場所で互いの上にレイヤーが表示されていることです。

レイヤリングの問題

これは、私がやりたいことのいくつかにとってかなり見苦しく、他の部分を完全に壊すことさえあります. 私が彼らに望んでいるのは、次のようにシームレスにマージすることです。

望ましい結果を重ねる

これまでのところ、スプライトのシーケンス全体を完全な不透明度で別のテクスチャに描画し、そのテクスチャを目的の不透明度で描画することだけが成功しました。私はこれを適度にうまく機能させ、おそらく必要なもののほとんどで機能させることができましたが、現在の大きな問題は、これらが画面に動的に描画されることと、かなり大きなテクスチャを変更するプロセスと送り返すことは、モバイル デバイスにかなりの負担をかけ、容認できないレベルのパフォーマンスを引き起こします。

ブレンドモードを試したり、アルファ値とカラー値のバランスをとって物事を均等にする風変わりな式を考え出すなど、より理想的な解決策を探すのにかなりの時間を費やしましたが、特に成功したものはありませんでした. 私の推測では、これに対する唯一の実行可能な方法は、前述のテクスチャを作成してそれにアルファ差を適用する方法ですが、低電力のモバイル デバイスでそれを機能させる最善の方法はわかりません。

4

1 に答える 1

2

これを行うには他にもいくつかの方法があるかもしれません: 最も簡単な方法は、ステンシル バッファーをアタッチし、最初にステンシルに円を描画してから、ステンシルで目的の色 + アルファを使用してフル スクリーンの四角形を描画することです。別のテクスチャを持ついくつかの FBO。

別の方法としては、ブレンドを無効にして最初にこれらの円を描画し、次に逆の「blendFunc」を使用してその上にシーン全体を描画することもできますが、他の要素もブレンドが必要な場合は不可能であることに注意してください。

3 つ目は、ステンシルを使用する代わりに、レンダー バッファーのアルファ チャネルを使用することです。カラー マスクを使用してアルファのみを描画し、円を描画してから、カラー マスクで RGB を再度有効にし、適切な "blendFunc" を使用してフルスクリーンの四角形を描画しますこれを行う前に (アルファのみへのカラー マスク、ブレンドを無効にし、アルファが 1.0 に設定された色でフルスクリーンの四角形を描画します)

于 2013-03-25T11:59:05.867 に答える