私は半透明を使用しないスプライト(セガのスーパースケーラアーケードを思い起こさせる)をたくさん持ったレトロな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ゲームでスプライト自体がソートされ、デプスバッファは使用されませんか?
コメントありがとうございます!確かに、あなたが話している第二の選択肢は何ですか?私はそれらをたくさん描いています(2000〜3000の大きなスプライトが典型的です)。 だから、透明と不透明のセクションで分離の興味があることである: - 私は 、通過し、Zバッファリングを使用して、簡単なシェーダと不透明テクスチャをレンダリングする - それから私は透明のスプライトパーツをレンダリングする、あまりにもZバッファを使用して( if + discardシェーダを使用して、まだ隠されていない部分)を削除します。 - 私は前処理で完全に透明な領域のほとんどを取り除こうとします。 メガドライブ上でスプライトと何をしていたか思い出してください^^ – Brunni
今日、効率的な理由から2Dスプライトを不透明で透明なセクションに分割するこのマリのブログがあります:https://community.arm。 com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-opengl-es – Columbo