2011-06-24 5 views
2

私はグラフィックスエンジンをやっている2Dゲームに取り組んでいて、シーンをいくつかの重なったレイヤーに分割して解決しようとしている、悪名高い透過性/深度テストの問題に達しました。すべてをソートする。2d OpenGLエンジンでレイヤード描画を行うにはどうすればよいですか?

オブジェクトを別のコンテナに分割する必要がありますか、別のレイヤーに描画するために何らかのバッファを使用する必要がありますか?後者を使用する場合は、どうすればよいですか、それともどうすればいいですか?

ありがとうございました!

答えて

1

あなたはあなたがすでにやっていることにかなり良いハンドルを持っているように思えます。私は、オブジェクトごとのソート間の決定、またはレイヤーへのすべてのレンダリングの後、合成は少し恣意的であると思います。レイヤーごとに異なるエフェクトを適用する場合や、特定のグラフィックスを再利用しようとする場合(たとえば、ほとんど更新されないバックグラウンドレイヤー、または低いfpsで実行できるバックグラウンドレイヤーがある場合)、レイヤーベースのシステムを実行する方が理にかなっています。一方で、フレームごとにすべてのフレームを再描画し、レイヤトリックごとにファンシーを必要としない場合は、すべてのテクスチャをblitするためにGPUのメモリ/塗りつぶしレートを少なくするだけでオブジェクトを並べ替える方が良いでしょうまわり。

+0

オブジェクトの奥行き値で奥行きの並べ替えを使用すると(レイヤーをまったく使用しない)、1フレームあたり数千スプライトを並べ替えることができますか?また、フレームバッファオブジェクトを使用する方が良いアイデアのようですが、どこから開始するのかはわかりません。S – Szoltomi

+0

問題になるまでのオーバーヘッドについては心配しません。最初に動作させてから最適化してください。複数のFBOを使用するか、または単一のFBOを使用するかの決定要因は、前者を必要とする複雑な効果を出すかどうかだけです。 – Mikola

0

私はこのarticleの結論を引用したいと思います:

これの結末は、あなたが単に特別な配慮なしに、任意の順序で、半透明オブジェクトをレンダリングすることができないということだけです。半透明なサーフェスが十分に複雑に動いている場合は、受け入れられるリアルタイムアルゴリズムでエラーを回避することは非常に難しいでしょう。

これは主に、あなたがあなたのシーンの内容について先験的に知っていることを容認するために準備されている事項の問題です。

私は同意します。そのほとんどは、あなたが描いているものによって決まります。

フラグメントシェーダにはの破棄記号があります。これはあなたの友人です:テクスチャを使用してオブジェクトをアルファベットしている場合は、並べ替えを避けるために役立ちます。私は、同じレイヤーに半透明/透明のオブジェクトをレンダリングすることで、将来同じ問題が発生する可能性があることに気づくでしょう。

フレームごとにすべてのオブジェクトを並べ替えることを避けるために、ソートされたオブジェクトツリーを実装する方がよいでしょう。しかし、それはすべてオブジェクトの構成とアプリケーションの制約に依存します。

関連する問題