0

QGLWidget の描画で問題が発生しました。ウィジェットにはいくつかのクワッドがあり、いくつかのキーを押すと動き回ることができます。四角形を描くだけですべてうまくいきますが、次を使用していくつかの線を追加したいと思います。

    glBegin(GL_LINE);
glColor3f(c[0], c[1], c[2]);
glVertex3f(v1.x, v1.y, v1.z);
glVertex3f(v2.x, v2.y, v2.z);
glEnd;

描画も正常に機能しますが、glwidget のクリアは機能しなくなりました。私がこれまでに描いたものすべてを見ることを意味します。言及するだけです。同じ初期化を使用してGLUTで同じことを試してみましたが、うまくいきましたが、Qtに切り替えたので、もううまくいきません。paintGL()、resizeGL()、initializeGL() は以下のとおりです。

void GLWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 0.0f, 0.0f, -10.0f, -20.0f, 0.0f, 20.0f, -10.0f);

glTranslatef(0.0f, -30.0f, -40.0f);
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
glRotatef(s_deg, 0.0f, 0.0f, 1.0f);
glRotatef(s_deg2, cos(DEGRAD(s_deg)), sin(DEGRAD(s_deg)), 0.0f);


float colors[8][3] = {
    0.5, 0.0, 0.0,
    0.0, 0.5, 0.0,
    0.0, 0.0, 0.5,
    1.0, 0.5, 0.5,
    0.5, 1.0, 0.5,
    0.5, 0.5, 1.0,
    0.9, 0.9, 0.9,
    0.1, 0.1, 0.1,

}; //red, green, blue, red shiny, green shiny, blue shine, light grey, dark grey

for(int i=0;i<glBoxes.size();i++) {
    glBoxes.at(i).setColor(colors[i]);
    glBoxes.at(i).drawCuboid();
    glBoxes.at(i).drawCuboidGrid();
}

}

void GLWidget::initializeGL() {    
glDepthFunc(GL_LESS);
glClearColor(0.2, 0.2, 0.2, 0.2);
glClearDepth(1.0);

}

void GLWidget::resizeGL(int width, int height) {    
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0.0f, 0.0f, (float)width, (float)height);
glLoadIdentity();
gluPerspective(45.0f, (float)width/(float)height, 0.5f, 100.0f);
glMatrixMode(GL_MODELVIEW);

}

何か案は?

4

4 に答える 4

3

glBeginによって受け入れられるトークンは

  • GL_POINTS
  • GL_LINES
  • GL_TRIANGLES
  • GL_TRIANGLE_FAN
  • GL_TRIANGLE_STRIP
  • GL_QUADS
  • GL_QUAD_STRIP

  • GL_POLYGON

使用するトークンGL_LINE(欠落している末尾のSではない)は、glBeginには無効です。


このステートメントglEnd;は、関数glEndのアドレスを評価し、結果を黙って破棄します。PascalまたはDelphiのバックグラウンドを持っている可能性がありますか?Cのような言語では、関数呼び出しにするために、一致する括弧のペアを追加する必要があります。パラメータを受け取らない関数は、空の括弧のペアで呼び出されます。たとえば、あなたの場合glEnd();


あなたの問題とは関係ありません。のすべてのコードはresizeGL、の先頭に配置する必要がpaintGLあります(ウィジェットwidth()height()ゲッターを使用します)。また、あなたが持っているものはにinitializeGL属していpaintGLます。

の適切な使用法はinitializeGL、テクスチャやシェーダーのロード、FBOの準備など、1回限りの初期化を行うことです。

resizeGLウィンドウサイズに依存し、ウィンドウサイズの後処理などに使用されるFBOで添付ファイルとして使用されるレンダーバッファやテクスチャなど、変更に非常に時間がかかるものを再/初期化することを目的としています。投影行列の設定はそこに属しておらず、ビューポートも属していません。それらはに入るpaintGL

glDepthFunc、glClearColor、およびglClearDepthは、描画プロセスに直接影響を与えるため、描画コードに属します。

また、イミディエイトモード(glBegin…glEnd)はまったく使用しないでください。OpenGL-1.1が15年以上前にリリースされて以来、古くなっています。バッファオブジェクトを追加する可能性のある頂点配列を使用します。

于 2013-01-28T18:03:51.233 に答える
1

GL_LINEの有効なトークンではありませんglBegin。線を引くには、必要がありますGL_LINES(それは微妙ですが、あなたは良い仲間です - これはよくある間違いです)。

GL_LINE関数によって制御されるポリゴンのレンダリング方法を制御するために使用されglPolygonModeます。

于 2013-01-28T17:44:56.897 に答える
1

GL_LINESの代わりにする必要がありますGL_LINE。で受け入れられるシンボルglBeginは複数形です (つまり、GL_QUADS、GL_LINE_STRIPS...)。

于 2013-01-28T17:42:42.140 に答える
1

glEnd;する必要がありますglEnd();。これにより、実際に問題が解決する場合があります。

于 2013-01-28T17:39:51.907 に答える