1

私は2Dゲームに取り組んでいます。XY 平面を想像してみてください。あなたはキャラクターです。キャラクターが歩くと、シーンの残りの部分が表示されます。

XY 平面が非常に大きく、現在のビューの外に他のキャラクターがいると想像してください。

これらのオブジェクトが現在のビューの外にレンダリングされていない場合、opengl で私の質問は次のとおりです。それらは処理時間を消費しますか?

また、レンダリングされたシーンの一部が表示されないようにするためのいくつかのアプローチは何ですか。現在の位置から 1000 単位離れた立方体がある場合、そのオブジェクトをレンダリングしたくありません。どうすればそれをレンダリングしないopenglにできますか。

最も簡単な方法は、位置を計算し、遠すぎる場合は立方体/オブジェクトを描画しないことだと思います。

4

5 に答える 5

7

"Clipping, Culling and Visibility Testing" に関するOpenGL faqは次のように述べています:

OpenGL は、特定のプリミティブが特定のビューポイントのシーンで表示されるかどうかを判断するための直接的なサポートを提供しません。最悪の場合、アプリケーションはこれらのテストを手動で実行する必要があります。前の質問には、これを行う方法に関する情報が含まれています。

先に進んで、そのリンクの残りの部分を読んでください。すべて関連しています。

于 2009-09-16T22:01:04.113 に答える
3

シーン グラフを正しく設定した場合、視野外のオブジェクトは表示パイプラインの早い段階でカリングされるはずです。オブジェクトが非表示であることを確認するには、コードでボックス チェックを行う必要があるため、処理のオーバーヘッドが多少発生します (ただし、それほど多くはありません)。

オブジェクトを合理的な階層に編成すると、1 つのボックス チェックだけでシーンの大きなセクションを選別できます。

于 2009-09-16T22:04:01.690 に答える
0

通常、アプリケーションはこれらの最適化を実行する必要があります。OpenGL は文字通り単なるレンダリング部分であり、オブジェクト管理などは実行しません。目に見えないもののデータを渡す場合、それが完全に画面外にあるか、クリップ プレーンの 1 つを超えているかを判断する前に、関連する座標をビュー空間に変換する必要があります。

パイプラインから非表示オブジェクトをカリングする方法はいくつかあります。オブジェクトがカメラの後ろにあるかどうかを確認することは、オブジェクトごとの簡単な計算で平均してデータセットの半分を拒否できるため、実行するのがおそらく最も簡単で安価なチェックです。実際の視錐台に対して同じ種類のテストを実行して、まったく見えないものをすべて拒否することはそれほど難しくありません。

明らかに複雑なゲームでは、すべての小さなオブジェクトに対してこれを行う必要はありません。したがって、それらを階層的にグループ化するのが一般的です (たとえば、銃をレンダリングしないと既に判断している場合は、銃をレンダリングしません)。それを保持するキャラクターをレンダリングする)、空間的に(例えば、世界をグリッド/四分木/八分木に分割し、すでに決定したゾーン内にあることがわかっているオブジェクトを拒否することは現在非表示です)、またはより一般的には以下の組み合わせ両方。

于 2009-09-18T18:07:32.650 に答える
0

「唯一の勝利の手は、プレーしないことだ」

すべての glVertex などは、最終的に画面にレンダリングされるかどうかに関係なく、パフォーマンス ヒットになります。これを回避する唯一の方法は、レンダリングされることのないオブジェクトを描画 (つまり、カリング) しないことです。

最も一般的な方法は、視錐台をカメラに結び付けることです。ゲームが 3d/2d であるかどうかに応じて、それを八分木または四分木と組み合わせると、錐台に対してすべてのゲーム オブジェクトをチェックする必要がなくなります

于 2009-09-18T19:18:15.357 に答える
0

基盤となるドライバー裏でカリングを行う場合がありますが、これは OpenGL 標準の一部ではないため、これに依存することはできません。あなたのコンピューターのドライバーはそれを行うかもしれませんが、他の誰か (あなたのゲームを実行するかもしれない) のドライバーはそうしないかもしれません。自分で選別するのが一番です。

于 2009-09-18T19:23:44.167 に答える