OpenGL Glut绘图点不起作用

时间:2016-07-19 07:35:46

标签: opengl draw glut point

有人可以帮我检查我的代码吗?我试图通过点击窗口绘制一个简单的点,但我看不到任何点。点记录系统作为示例从一个堆栈溢出柱复制。

#include <stdlib.h>
#include <stdio.h>
//#include <GL\glew.h>
#include <gl/glut.h>
//#include <GL\freeglut.h>
#include <math.h>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include "draw.h"

//DRAW draw2;

class Point
{
    int Xvalue, Yvalue;
    std::string Text;
public:
    void xy(int x, int y)
    {
        Xvalue = x;
        Yvalue = y;
    }

    void text(std::string text)
    {
        Text = text;
    }

    //return individual x y value
    int x() { return Xvalue; }
    int y() { return Yvalue; }

    //return text value
    std::string rtext() { return Text; }    
};

Point point[30];
int count = 0;


void Init()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    //glColor3f(0.0, 0.0, 0.0);
    //glPointSize(5);

    glMatrixMode(GL_PROJECTION);    //coordinate system
    //glLoadIdentity();
    gluOrtho2D(0.0, 1200.0, 0.0, 800.0);
}


void Display()
{
    glClear(GL_COLOR_BUFFER_BIT); // clear display window
    glColor3f(1.0, 1.0, 1.0);
    //glLoadIdentity();

    /*Drawing here*/
    //redraw 
    for (int i = 0; i < count; i++)
    {
        int x = point[i].x();
        int y = point[i].y();

        //draw2.Dot(x, y);
        std::cout << "drawing dot " << x << " " << y << std::endl;
        glBegin(GL_POINTS);
            glColor3f(0.3, 0.3, 0.3);
            glPointSize(5.0f);
            glVertex2i(x, glutGet(GLUT_WINDOW_HEIGHT) - y);
        glEnd();    
    }
    glFlush();
}


void mouse(int button, int state, int x, int y)
{       
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {       
        point[count].xy(x, y);
        //draw2.Dot(x, y);
        count++;    
    }    
    glutPostRedisplay();
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);                          //initialize toolkit
                                                    //Request double buffered true color window with Z-buffer
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );   //display mode
    glutInitWindowSize(1200, 800);                  //set window size
    glutCreateWindow("NURBS Curve");                //open screen window

    Init(); //additional initializations

    //CALLBACK FUNCTIONS
    glutMouseFunc(mouse);
    glutDisplayFunc(Display);   //send graphics to display window    
    /*
    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        fprintf(stderr, "GLEW error");
        return 1;
    }
    */    
    //pass control to glut for events, loops
    glutMainLoop();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

    glBegin(GL_POINTS);
        glColor3f(0.3, 0.3, 0.3);
        glPointSize(5.0f);  // wat
        glVertex2i(x, glutGet(GLUT_WINDOW_HEIGHT) - y);
    glEnd();    

您可以在glBegin()/glEnd()对中调用GL功能的简短列表,但glPointSize()不在其中:

  

glBegin和glEnd之间只能使用GL命令的子集。               命令是               glVertex,               glColor,               glSecondaryColor,               glIndex,               glNormal,               glFogCoord,               glTexCoord,               glMultiTexCoord,               glVertexAttrib,               glEvalCoord,               glEvalPoint,               glArrayElement,               glMaterial,和               glEdgeFlag。               也,               可以接受使用               glCallList或               glCallLists执行               显示仅包含上述命令的列表。               如果在glBegin和glEnd之间执行任何其他GL命令,               错误标志已设置,命令将被忽略。

glPointSize()移到glBegin() / glEnd()对之外:

glPointSize(5.0f);
glBegin(GL_POINTS);
for (int i = 0; i < count; i++)
{
    int x = point[i].x();
    int y = point[i].y();

    glColor3f(0.3, 0.3, 0.3);
    glVertex2i(x, h - y);
}
glEnd();  

所有在一起:

#include <gl/glut.h>

class Point
{
    int Xvalue, Yvalue;
public:
    void xy(int x, int y)
    {
        Xvalue = x;
        Yvalue = y;
    }

    //return individual x y value
    int x() { return Xvalue; }
    int y() { return Yvalue; }
};

Point point[30];
int count = 0;

void Display()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT); // clear display window

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    const double w = glutGet( GLUT_WINDOW_WIDTH );
    const double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluOrtho2D(0.0, w, 0.0, h);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(1.0, 1.0, 1.0);

    glPointSize(5.0f);
    glBegin(GL_POINTS);
    for (int i = 0; i < count; i++)
    {
        int x = point[i].x();
        int y = point[i].y();

        glColor3f(0.3, 0.3, 0.3);
        glVertex2i(x, h - y);
    }
    glEnd();    

    glFlush();
}

void mouse(int button, int state, int x, int y)
{       
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {       
        point[count].xy(x, y);
        count++;    
    }    
    glutPostRedisplay();
}

int main( int argc, char *argv[] )
{
    glutInit(&argc, argv);                       
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize(1200, 800);               
    glutCreateWindow("NURBS Curve");             

    glutMouseFunc(mouse);
    glutDisplayFunc(Display);

    glutMainLoop();
    return 0;
}

答案 1 :(得分:0)

发现glcolor3f和glpointsize必须首先在我的Init()函数中初始化。

void Init()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0, 0.0, 0.0);   //this one
    glPointSize(5);             //and this one

    glMatrixMode(GL_PROJECTION);    //coordinate system
    //glLoadIdentity();
    gluOrtho2D(0.0, 1200.0, 0.0, 800.0);
}