如何使用opengl绘制一个简单的网格?

时间:2015-09-27 15:25:30

标签: c++ opengl

我正在尝试绘制一个看起来像这样的网格: enter image description here

但我得到的是: enter image description here

黑色屏幕,左边和右边有两条橙色线

这是我的代码:

#include <iostream>
#include <GL/glut.h>

#define WIDTH 1000
#define HEIGHT 400
#define OFFSET 200

using namespace std;

float x = 0;
float y = 0;

void init (void)
{
    //glClearColor (1.0, 1.0, 1.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    glOrtho (0.0, 5.0, 0.0, 5.0, -2.0, 2.0);

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
}

void drawline (float x1, float y1, float x2, float y2)
{
    glBegin (GL_LINES);
    glVertex2f (x1, y1);
    glVertex2f (x2, y2);
    glEnd();
}

void drawgrid()
{
    glClearColor (1.0, 1.0, 1.0, 1.0);
    glColor3ub (240, 57, 53);

    for (float i = 0; i < HEIGHT; i += 10)
    {
        if ((int) i % 100 == 0) glLineWidth (3.0);
        else if ((int) i % 50 == 0) glLineWidth (2.0);
        else glLineWidth (1.0);
        drawline (0, i, (float) WIDTH, i);
    }

    for (float i = 0; i < WIDTH; i += 10)
    {
        if ((int) i % 100 == 0) glLineWidth (3.0);
        else if ((int) i % 50 == 0) glLineWidth (2.0);
        else glLineWidth (1.0);
        drawline (i, 0, i, (float) HEIGHT);
    }
}

void display()
{
    drawgrid();

    glFlush();
    glutSwapBuffers();
}

int main (int argc, char **argv)
{
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize (WIDTH, HEIGHT);
    glutCreateWindow ("ECG");

    init();

    glutDisplayFunc (display);
    glDisable (GL_TEXTURE_2D);

    glutMainLoop();

    return 0;
}

我做错了什么?如何使背景变白并正确绘制网格?

2 个答案:

答案 0 :(得分:2)

您可以设置投影以将坐标范围[0,5]映射到屏幕。然后,您在10个单位的距离处绘制线条,因此仅显示y = 0的线条。

实际上,图像是特定于实现的。你可以看到底部的水平线,或者你看不到它,因为你不是在底部像素中心绘制底部像素行的底部边框。一个实现可能会围绕这一点。这就是你的左边垂直线x = 0时发生的事情。

因此,您应该设置glOrtho调用以匹配您要使用的坐标范围,并且您将看到正在绘制的线条。

使用glClearColor更改背景颜色。

也不要将glutInitDisplayMode(GLUT_SINGLE | ...)glutSwapBuffers()结合使用。使用单缓冲,然后没有交换缓冲区,或者,如我所建议的,在帧完成后使用双缓冲和交换缓冲区。同时删除glFlush,如果使用glutSwapBuffers则不需要。{/ p>

答案 1 :(得分:2)

另一种绘画方式

 void drawSquare()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glColor3f(1.0, 0.0, 0.0);
    int xsize=0,ysize=0;
    for(int j=0;j<10;j++)
    {

        xsize=0;
        for(int i=0;i<10;i++)
        {
             glBegin(GL_POLYGON);
               glVertex3f(-50.0+xsize, -50.0+ysize, 0.0);
               glVertex3f(-40.0+xsize, -50.0+ysize, 0.0);
               glVertex3f(-40.0+xsize, -40.0+ysize, 0.0);
               glVertex3f(-50.0+xsize, -40.0+ysize, 0.0);
            glEnd();
         xsize+=10.0;
     }
     ysize+=10.0;
     }
     glFlush();
  }

使用glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1 enter image description here。0);