0

私はそのようなコードを持っています

      glNewList(displist_boxy, GL_COMPILE);


      for(int i=0; i<scene_max; i++)
      {
        DrawAABox( sceneGL[i].x,
                sceneGL[i].y,
                sceneGL[i].z,
                10,10,10
                 );
      }

     glEndList();

DrawAABoxは、6つの4軸整列ボックスを描画します(glBegin glNormal GlVertexx ... glEndを使用)。これは即時モードで機能しますが、上記のように表示リストを作成しようとすると、効果がありません(ボックスは描画されません)。動作するか、これは動作しないはずです(私はそれをあまり知りません)

4

3 に答える 3

2

glNewList/glEndListディスプレイリストは、ブロック内で実行されたすべてのOpenGL操作を一定のコマンドセットに抽出します。これらのコマンドは、ディスプレイリストを呼び出すときに実行されます(を使用glCallList)。これは、リスト作成内のすべての「動的」コードがリストにコンパイルされることを意味します。sceneGL[i]したがって、呼び出されると、ボックスはリストを作成したときの位置を使用します。実際には、一定数のボックスしかありません。これはscene_max、リストを作成するときの数です。したがって、初期化コードでこれを行うと、どこにあるscene_maxかもしれませんが0、何も描画されません。

考えてみてください。このリストを作成するときに、ドライバーはおそらく何ができるでしょうか。呼び出されたすべてのOpenGLコマンドを記録して(場合によっては圧縮および最適化された形式に変換して)後で送信するか、実行時に最終的な実行可能ファイルから実行されたマシンコード(およびその周辺のコンテキスト全体)を魔法のように取り出して保存し、すべての操作を呼び出します。間でしglNewList/glEndListたか(とにかく、すぐに実行する場合と比較すると、パフォーマンスはそれほど向上しません)?

編集:補足として、ジオメトリの事前記録にVBOを使用することをお勧めします。これは、ディスプレイリストと比較して、状態変更の記録などの一部の機能を失う可能性がありますが、動的データ更新などの他の機能を提供します。同様に、ディスプレイリストの実装は完全に実装次第であり、VBOなどよりも高速ではない可能性があります。同様に、それらは非推奨になっています(ドライバーはめったに使用されないパスを適切に最適化する傾向がないため、最新のハードウェアでの実装がお粗末で遅いことを意味する場合もあります)。

于 2012-11-02T08:58:49.917 に答える
1

displist_boxy変数のUIDの生成を見逃しているようです。外観は次のとおりです。

coAxis := glGenLists(1);
glNewList(coAxis, GL_COMPILE);
  glBegin(GL_TRIANGLES);
    ...
  glEnd;
glEndList;

使用法は次のとおりです。

glCallList(coAxis);
于 2012-11-02T08:45:04.430 に答える
1

ディスプレイリストを作成するには、最初にターゲットのOpenGLコンテキストを作成してバインドする必要があります。OpenGLコンテキストが存在する前に呼び出されたコードでディスプレイリストを初期化した場合、後で何も表示されません。

また、ChristianRauがhttps://stackoverflow.com/a/13192138/524368であなたに言ったこと

補足:ディスプレイリストは使用しないでください。それらは約10年間非推奨になり(OpenGL-2は当初ディスプレイリストを廃止する予定でした)、OpenGL-3は半年後にそれに続きました。

代わりにVBOとVAOを使用してください。

于 2012-11-02T09:01:45.103 に答える