2017-03-06 3 views
1

単純なglutプログラムを作成しようとしましたが、ウィンドウのサイズを変更すると表示されるエラーが表示されます。私はkdeでArch Linuxを使用しています。 どうすれば修正できますか?リサイズ前Linuxでglutを使用してウィンドウのサイズを変更するとエラーが表示される

:リサイズ後

enter image description here

enter image description here

#include <GL/glut.h> 
#include <stdio.h> 
#include <stdlib.h> 
void myinit(void) 
{ 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glColor3f(1.0, 0.0, 0.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500.0, 0.0, 500.0); 
    glMatrixMode(GL_MODELVIEW); 
} 
void display(void) 
{ 
    typedef GLfloat point2[2]; 
    point2 vertices[3]={{0.0,0.0},{250.0,500.0},{500.0,0.0}}; 
    int i, j, k; 
    int rand(); 
    point2 p ={75.0,50.0}; 
    glClear(GL_COLOR_BUFFER_BIT); 
    for(k=0; k<5000; k++) 
    { 
    j=rand()%3; 
    p[0] = (p[0]+vertices[j][0])/2.0; 
    p[1] = (p[1]+vertices[j][1])/2.0; 
    glBegin(GL_POINTS); 
      glVertex2fv(p); 
    glEnd(); 
    } 
    glFlush(); 
    printf ("display invokved....\n"); 
} 
void main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Sierpinski Gasket"); 
    glutDisplayFunc(display); 
    myinit(); 
    glutMainLoop(); 
} 
+0

試してみますすべてのフレームを描画する前に、現在のウィンドウの幅と高さをパラメータとして 'glViewport()'を呼び出します。 – Bartvbl

答えて

0

は私のシステム上でそれを修正します。

#include <GL/glut.h> 
#include <stdio.h> 
#include <stdlib.h> 
void display(void) 
{ 
    typedef GLfloat point2[2]; 
    point2 vertices[3]={{0.0,0.0},{250.0,500.0},{500.0,0.0}}; 
    int i, j, k; 
    int rand(); 
    point2 p ={75.0,50.0}; 

    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 500.0, 0.0, 500.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBegin(GL_POINTS); 
    glColor3f(1.0, 0.0, 0.0); 
    for(k=0; k<5000; k++) 
    { 
    j=rand()%3; 
    p[0] = (p[0]+vertices[j][0])/2.0; 
    p[1] = (p[1]+vertices[j][1])/2.0; 
    glVertex2fv(p); 
    } 
    glEnd(); 
    glutSwapBuffers(); 
} 
int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Sierpinski Gasket"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+0

ありがとう、それは動作します! GLUT_SINGLEを使用してプロブラムがある理由を説明してもよろしいですか? –

+0

@haokunli:悲しいことに、 'GLUT_SINGLE'がなぜ正しく動作していないのかについての良い説明はありません。(M *が動作している私のLinuxマシンでは、ファンキーでサイズ変更されない動作を再現できましたコンポジションを有効にしました。 – genpfault

+0

ありがとうございます。 –

0

あなたは、resizeイベントをキャプチャする必要があります。 glutでは、関数glutReshapeFuncを使用してコールバックを登録する必要があります。この機能では、投影パラメータとビューポートを変更できます。

以下

は、あなたがこれを行うことができます方法を示し、あなたのプログラムの小さな変化である:ダブルバッファリング(GLUT_DOUBLE & glutSwapBuffers())への切り替え

(...) 
void reshape(int width, int height) 
{ 
    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, width, 0.0, height); 
    glMatrixMode(GL_MODELVIEW); 
} 
(...) 
int main(int argc, char** argv) 
{ 
(...) 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); /* <--- */ 
    myinit(); 
(...) 
} 
+0

申し訳ありませんが、動作しません。まだ正しく表示できない領域は表示できません。しかし、スクリーン座標を拡大するので、ウィンドウのサイズを変更するとポイントの位置は変わりません。まだありがとう。 –

関連する問題