在opengl中绘制点

Mon*_*nil 0 c++ 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;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ell 6

有几个问题。为了找到它们,我自己编译并完成了它们:

  • GL_POINT应该GL_POINTS在显示点。 GL_POINT完全意味着别的东西——GL_POINTS即使你只显示一个点,你仍然在使用
  • 每次绘制一个点时您都在清除,因此您只会看到一个点(但由于上述原因,该点最初并未绘制)。仅当您要擦除整个屏幕时才清除。
  • 我没有使用过 glut,所以我并不乐观,但看起来您立即用混乱覆盖了 displayFunc 回调,所以我认为从未调用过 setup 。我只是将设置推到了混乱循环的开始。
  • 你在 main 中再次定义了你的数组——没关系,但那些没有被使用。只使用了全局的。-Wall如果您还没有添加到您的编译器标志,我建议您添加,因为编译器会告诉您这一点:)

真正的失败之处在于,您每次绘制一个点时都在清除,而由于使用GL_POINT.

由于您是 GL 的新手,我将提到glGetError()作为第一遍调试机制非常有用。您可以调用它并检查程序中各个点的返回值,以查看 GL 是否告诉您您做错了什么。例如,在这种情况下,glGetError()在您的 drawpoint 函数之后调用将返回 error GL_INVALID_ENUM,因为您在调用 时使用了无效的枚举值(GL_POINT而不是GL_POINTSglBegin()

这是一个工作示例,以防万一。我希望你不介意我重新格式化并压缩它以便更容易在这里分享(有些是为了帮助我阅读和理解它)。这是一个简洁的程序,我不知道它会在我运行时输出它所做的事情。凉爽的 :)

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

如果有什么没有意义,请告诉我。