gl_quadsを使用する利点はまだありますか?


10

わかりました。gl_quadsは非推奨であることを理解しているため、もはや使用することは想定されていません。また、最近のPCでgl_quadsを使用してゲームを実行すると、実際には2つの三角形が描画されることも理解しています。

今、私はゲームが代わりに三角形を使って書かれるべきだと聞いたことがあります。しかし、OpenGLがそのクワッドを2つの三角形にどのように作成するかの詳細のために、クワッドをまだ使用することがこれまでに有利であるかどうか疑問に思っています。

具体的には、現在、かなり大きなバッファーオブジェクトから、接続されていない多くのクワッドをレンダリングしています。注意が必要な領域の1つは、これらのバッファーオブジェクトを作成/更新するために使用しているフロートのベクトルがどれだけ大きいかです(頂点ごとにかなりの数の追加のフロート値と、バッファー内に多数の頂点があります-最大のバッファーは約500KBです)。

したがって、バッファオブジェクトを変更して三角形を描画する場合、この頂点データは50%大きくなり(6つの頂点では4ではなく正方形を描く)、CPUが生成するのに50%長くかかることがわかります。

gl_quadsが引き続き機能する場合、ここでメリットがありますか、それともOpenGLの2つの三角形への自動変換で50%の追加メモリとCPU時間を使用していますか?


5
OpenGLが何らかのインデックス付き頂点バッファーをサポートしていると確信しています。つまり、クワッドに同じ4つの頂点のみを保存し、頂点全体を繰り返して2つの三角形を作成するのではなく、インデックスのみを繰り返します:[0,1,2] 、[2,3,0]


GL仕様は、たとえばglPolygonMode(...、GL_LINE)を使用して、クワッドとして描画することが重要であるいくつかのケースをまだ規定していると思います。
Maximus Minimus 2013年

回答:


5

実際のゲームをテストします。クワッドの方が速い場合は、それらを使用してください。そうでない場合は、しないでください。

一部のハードウェアはクワッドをサポートしていないため、場合によっては低速になると考えられます。そのため、ドライバーはクワッド描画呼び出しを「修正」するために多くの作業を行わなければなりません。一部のハードウェアは四角形をサポートし、いくつかの固定機能入力アセンブリステップで三角形に分割するため、大きなオーバーヘッドなしで機能します。クワッドがインデックス付きとインデックスなしのどちらでサブミットされるかについても質問があります。これにより、限られたバス転送帯域幅とCPU生成時間をより有効に活用できます。人々の知恵は、クワッドを避けるように言っています。これは、何もないところから始めている場合は良いアドバイスですが、コードがすでに機能している場合はそれほど多くはありません。人々の知恵によれば、実際にパフォーマンスの高いゲームがそれらのことを行っていても、多くのものがパフォーマンスを殺すとのことです。

つまり、テストします。想定しないでください。パフォーマンスのアドバイスをインターネットに求めないでください。私たちは時々正しいかもしれませんが、多くの場合、古くなったデータ、あなたがいない特定の状況に基づくデータ、または私たち自身がインターネットまたは同僚(彼ら自身ではないかもしれない)から直接入手した完全なゴミをフィードします直接の経験がある)。


3

代替案は何ですか?まあ、1つの代替方法は、ジオメトリシェーダーを使用して、GL_LINES_ADJACENCYプリミティブ(4つの頂点)を渡し、GSにこのプリミティブを三角形のストリップに変換させることです。ただし、ジオメトリシェーダーのレンダリングは常に遅いと想定する必要があるため、レンダリングは遅くなります。

より良い方法は、インデックス付きレンダリングを使用することです。ここでは、次の2つの選択肢がありますGL_TRIANGLESし、GL_TRIANGLE_STRIP原始的な再起動と。後者の場合、インデックスバッファーがわずかに短くなります(クワッドごとに1つのインデックス)。クワッドレンダリングで同じインデックスバッファーを再利用できるため、インデックスバッファーを更新または変更する必要はありません。

インデックスタイプとしてunsigned shortsを使用することもお勧めします。一度に16384個を超えるクワッドをレンダリングする必要がある場合は、glDrawElementsBaseVertexを使用して複数のレンダリング呼び出しを行い、インデックスをオフセットします。


最近行ったいくつかのベンチマークでは、glMultiDrawArraysがNVとAMDの両方で高速パスであることが示されています(Intelでは問題ありません)。別のオプション-ファンまたはストリップを備えたglMultiDrawArraysがあります。
Maximus Minimus

@ mh01:これには、描画コマンドのクライアント側の配列が必要です。glMultiDrawArraysIndirectGPU側で行う必要があります。できることですが、ハードウェアが制限されます。
Nicol Bolas 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.