2016-07-05 19 views
0

私は半透明を使用しないスプライト(セガのスーパースケーラアーケードを思い起こさせる)をたくさん持ったレトロな2Dゲームを持っています。私は物事を単純化するためにZバッファをソートに使うことを考えました。OpenGL ES、Zバッファ、2Dスプライト、破棄、パフォーマンス

http://i.stack.imgur.com/ubLlp.png

、私は、OpenGL ES 2によ以来、私が持っていない:OK、しかし、デフォルトの書き込みでアルファがここに示す効果を与え、ゼロで​​あっても、Zバッファに行われます私が唯一の可能性を理解しているから、アルファが0であればフラグメントシェーダからピクセルを破棄し、Zバッファに書き込まないようにすることです。しかしパフォーマンスに関しては、これは間違っています。ifは遅いだけですが、discardは基本的に目的を殺します。なぜなら、初期の深度テストを無効にし、その結果はソフトウェアで行うよりも悪いからです。

if (val.a < 0.5) { 
    discard; 
} 

パフォーマンスを低下させない他のソリューションがありますか?すべての2Dゲームでスプライト自体がソートされ、デプスバッファは使用されませんか?

答えて

0

本当にトレードオフです。 Zバッファにソートを行い、シェーダで破棄を使用させると、分岐や深度テストのためにGPUでの処理がより高価になります。

深度ソートを行うと、描画呼び出しを最適な順序で発行することが難しくなります(たとえば、テクスチャを変更する必要はありません)。 GLES2の描画呼び出しは、ローエンドのデバイスで非常に重要なCPUヒットを持ち、カウントはおそらく上がるでしょう。

パフォーマンスが非常に懸念される場合は、描画呼び出し回数を最小限に抑えるために、テクスチャの前面にある大きな努力と組み合わせて使用​​すると、おそらく2番目のオプションが優れています。スプライトが低い場合テクスチャアトラスごとに多くのスプライトを得ることができるので、高解像度のレトロスプライトを作成することができます。どんなストレッチでも当然の勝者ではなく、さまざまなゲームが異なるアプローチを取っていると私は想像することができます。

また、ターゲットハードウェアの大部分は、選択したパスをうまく実行することを考慮する必要があります。実装する方が速いものを選択し、コードを簡単にする必要があります。おそらくzバッファに並べ替えをさせる)。

技術的な難題がある場合は、スプライトを完全に不透明なセクションと透明部分のセクションに分割し、2つのパートを別々のメッシュとしてレンダリングすることをお勧めします)。多くの前処理を行い、より多くの三角形を描画する必要がありますが、完全に不透明な部分でレンダリングできるようにすることで、すべてのiOSデバイスでの隠面除去技術を活用できますAndroid搭載端末確かにこれを行うことで、埋め込み率の負担を軽減することができるはずですが、ドローコールが増えてしまい、コードやツールに複雑さが増して不必要に多くなることがあります。

+0

コメントありがとうございます!確かに、あなたが話している第二の選択肢は何ですか?私はそれらをたくさん描いています(2000〜3000の大きなスプライトが典型的です)。 だから、透明と不透明のセクションで分離の興味があることである: - 私は 、通過し、Zバッファリングを使用して、簡単なシェーダと不透明テクスチャをレンダリングする - それから私は透明のスプライトパーツをレンダリングする、あまりにもZバッファを使用して( if + discardシェーダを使用して、まだ隠されていない部分)を削除します。 - 私は前処理で完全に透明な領域のほとんどを取り除こうとします。 メガドライブ上でスプライトと何をしていたか思い出してください^^ – Brunni

+0

今日、効率的な理由から2Dスプライトを不透明で透明なセクションに分割するこのマリのブログがあります:https://community.arm。 com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-opengl-es – Columbo

関連する問題