2017-05-26 84 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_POINTSGL_POINT意味着完全不同 - 即使您只顯示一個點,您仍然使用GL_POINTS
  • 您每次繪製點時都會清除,因此您只會看到一個點(但點沒有在第一個點繪製由於上述原因)。只有當你想擦拭整個屏幕時清除。
  • 我沒有使用過剩,所以我不積極,但它看起來像你立即覆蓋displayFunc回調混亂,所以我不認爲安裝程序曾被稱爲。我只是將設置推入混沌循環的開始階段。
  • 您在main中再次定義了數組 - 它沒有關係,但那些沒有被使用。只有全球的使用。我建議將-Wall你的編譯器標誌,如果你還沒有準備好,因爲編譯器會告訴你這個:)

真的失敗的一點是,你每次清除你畫一個點,同時也沒有實際上是由於使用GL_POINT而引起的。

既然您是GL的新手,我會提及glGetError()作爲第一遍調試機制非常有用。你可以調用它並檢查程序中各個點的返回值,看GL是否告訴你你做錯了什麼。在這種情況下,例如,在您的提示點函數返回錯誤GL_INVALID_ENUM之後調用glGetError(),因爲您使用了一個無效的枚舉值(GL_POINT而不是GL_POINTS)來撥打glBegin()

這是一個可以幫助你的例子。我希望你不要介意,我已經格式化了&,使它更容易在這裏分享(有些是幫助我閱讀和理解它)。這是一個整潔的程序,我不知道它會輸出它在我工作時所做的。酷:)

#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

讓我知道,如果有什麼是沒有意義的。