2017-05-26 6 views
-1

私はウィンドウ上にいくつかのポイントを印刷しようとしていますが、ウィンドウに何も表示されません。ウィンドウの背景はグレーの色に設定されています。私のコードopenglのポイントをプロットする

#include <GL/freeglut.h> 
#include <GL/gl.h> 
#include<unistd.h> 
#include<iostream> 
using namespace std; 

float a[2]={0,0.7},b[2]={-0.3,-0.5},c[2]={0.5,-0.55}; 
float m[2]={0.0,0.0}; 

int roll_die() { 

int k= (rand()%6) + 1; 
return k; 
} 

void midpoint(float p[],float q[],float *k) 
{ 
for(int i=0;i<2;i++) 
{ 
k[i]=(p[i]+q[i])/2; 
} 
} 

void displaypoint(float a[]) 
{ 

glClear(GL_COLOR_BUFFER_BIT); 
glColor3f(1.0,1.0,1.0); 

glBegin(GL_POINT); 
      glVertex2f(a[0], a[1]); 

    glEnd(); 
glPointSize(8.0); 
glFlush(); 

} 

void setup() 
{ 
glClear(GL_COLOR_BUFFER_BIT); 
glColor3f(1.0, 1.0, 1.0); 

    glBegin(GL_POINTS); 
     glVertex2f(a[0], a[1]); 
     glVertex2f(b[0],b[1]); 
     glVertex2f(c[0],c[1]); 
glEnd(); 
glPointSize(8.0); 
glFlush(); 
} 

void chaos() 
{ 
int num; 
for(int i=0;i<1000;i++) 
{ 
num=roll_die(); 
if(num==1 || num==2) 
midpoint(m,a,m); 
else if(num==3 || num==4) 
midpoint(m,b,m); 
else 
midpoint(m,c,m); 
displaypoint(m); 
usleep(2000); 
} 
} 

int main(int argc, char **argv) 
{ 
int num; 
float a[2]={0,0.7},b[2]={-0.3,-0.5},c[2]={0.5,-0.55}; 
float m[2]={0.0,0.0}; 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_SINGLE); 
glutInitWindowSize(500, 500); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("OpenGL - Creating a triangle"); 
glClearColor(0.4, 0.4, 0.4, 0.4); 
glutDisplayFunc(setup); 
glutDisplayFunc(chaos); 
glutMainLoop(); 
return 0; 
} 

答えて

3

いくつかの問題がありました。それらを見つけるために、私はちょうどそれを自分でコンパイルし、それらを介して働いていた:

  • GL_POINTはdisplaypointでGL_POINTSでなければなりません。 GL_POINTは完全に何かを意味します - あなたは1つの点だけを表示してもまだGL_POINTSを使用しています
  • ポイントを描くたびにクリアされているので、ポイントは1つしか表示されません上記の理由により)。画面全体をワイプしたいときのみクリアします。
  • glutを使用していないので、私は肯定的ではありませんが、すぐにdisplayFuncコールバックを混乱させるように見えるので、セットアップが呼び出されたとは思われません。私はあなたのカオスループの始めにセットアップをプッシュしました。
  • メインに配列を再度定義しました。これは問題ではありませんが、使用されていませんでした。グローバルなものだけが使用されました。お持ちでない場合、コンパイラはあなたにこのことを告げていたとして:)

を私は本当に失敗のポイントはあなたもされていないが、あなたがポイントを描いたたびにクリアされたということでした、あなたのコンパイラフラグに-Wallを追加することをお勧めします実際にはGL_POINTの使用のためにその点を描いています。

GLを初めてお使いになったので、glGetError()はファーストパスのデバッグメカニズムとして非常に便利だと言います。あなたはそれを呼び出して、あなたのプログラムのさまざまなポイントで戻り値をチェックして、GLがあなたに何か間違ったことを伝えているかどうかを調べることができます。この場合、glBegin()への呼び出しに無効な列挙値(GL_POINTではなくGL_POINTS)を使用したため、drawpoint関数の後にglGetError()を呼び出すとエラーGL_INVALID_ENUMが返されます。

これは役立つ場合のあなたのための実例です。 &をここで簡単に共有できるように再フォーマットしたことを気にしないでください(いくつかは読んで理解しやすくなりました)。それはきちんとしたプログラムです、私はそれが働いたときの結果を出力するつもりはないと思いました。クール:)

#include <GL/freeglut.h> 
#include <GL/gl.h> 
#include <unistd.h> 

float a[2] = { 0.0f, 0.70f }; 
float b[2] = { -0.3f, -0.50f }; 
float c[2] = { 0.5f, -0.55f }; 
float m[2] = { 0.0f, 0.00f }; 

void midpoint(float p[], float q[], float* k) { 
    for (int i = 0; i < 2; i++) 
    k[i] = (p[i] + q[i])/2; 
} 

void chaos() { 
    glPointSize(1.0); 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 1.0, 1.0); 

    for(int i = 0; i < 100000; i++) { 
    int num = (rand() % 6) + 1; 
    if (num < 3) 
     midpoint(m, a, m); 
    else if (num < 5) 
     midpoint(m, b, m); 
    else 
     midpoint(m, c, m); 

    glBegin(GL_POINTS); 
     glVertex2f(m[0], m[1]); 
    glEnd(); 
    glFlush(); 
    } 
} 

int main(int argc, char* argv[]) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutInitWindowSize(500, 500); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("OpenGL - Creating a triangle"); 
    glutDisplayFunc(chaos); 
    glutMainLoop(); 
    return 0; 
} 

出力:

enter image description here

何も意味がないなら、私に教えてください。

関連する問題