2017-05-26 86 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

让我知道,如果有什么是没有意义的。