0

openGLで図形を描画し、Windowsフォームでその図形のプロパティの値を変更するツールを作成しようとしています。したがって、私の形状が長方形の場合、ユーザーが長方形のサイズや色などを制御できるフォームを作成します。openGLコードをマネージC++で、フォームをc#で記述しましたが、これらの形状の一部がより複雑になったため、(パフォーマンスと予測可能性の両方の目的で)それらの表示リストを作成することにしました。

シェイプのコンストラクターで表示リストを定義し、renderメソッドで表示リストを呼び出します。

私の問題は、ディスプレイリストがまったく実行されないことです。表示リストの外側でレンダリングした部分はレンダリングされますが、表示リストの内側の部分はレンダリングされません。

これが私のプロセスのサンプルコードです:

//c# side
GLRectangle rect
public CSharpRectangle() {
    rect = new GLRectangle();
}

//managed c++ side
public GLRectangle() {
   width = 50;
   height = 50;
   //initialize more values
   rectDL = glGenLists(1);
   glNewList(rectDL, GL_COMPILE);
        renderRect();
   glEndList();
}
public render() {
     //Draw border
glBegin(GL_LINE_LOOP);
    glVertex2f(0, 0);
    glVertex2f(width, 0);
    glVertex2f(width, height);
    glVertex2f(0, height);
glEnd();

     //Draw interior
     glCallList(rectDL);
}
private renderRect() {
     glRectf(0,0,width,height);
}

この例では、長方形の境界線はレンダリングされますが、長方形自体はレンダリングされません...表示リストを単にメソッド呼び出しに置き換えると、長方形は正常にレンダリングされます。なぜこれが起こっているのか誰かが知っていますか?

4

2 に答える 2

1

2セントをあげたいです。

あなたの質問のコードは私には正しいように思われるので、おそらくあなたのアプリケーションにあなたのディスプレイリストを実行できないようにする何かがあります。

私が考えることができる唯一のことは、ディスプレイリストをコンパイルするときに現在のコンテキストがないということです(実際、GlRectangleコンストラクターを実行するとき)。それで、そのルーチンはglMakeCurrentを呼び出した同じスレッドで実行されますか?そのルーチンはglMakeCurrentの後に呼び出されますか?

さらに、操作を検証するために、各OpenGLルーチンの後にglGetErrorを確認してください。エラーが返された場合は、コードの何が問題になっているのかを知ることができます。

于 2011-08-01T07:39:14.437 に答える
-2

あなたが望むものを手に入れることができないかもしれない理由は、それがもうそこにないという理由だけです。openGL Redの本を読んでいたときに、openGL 3.1以降ではディスプレイリストが非推奨になっていることに気付きました(単に削除されたことを意味します)。そのためにグーグルで確認しました。理由はもう覚えていませんが、VAOやVBOをいじっていたからだと思います。したがって、opengl 3.1よりも高いバージョンを使用している場合、ディスプレイリストは表示されなくなります。

于 2011-07-30T23:23:15.893 に答える