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

How to draw a simple grid using opengl?

我正在尝试绘制一个如下所示的网格:

但我得到的是:

黑色屏幕,左侧和底部边框有两条橙色线条

这是我的代码:

#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;
}

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

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

实际上,图像是特定于实现的。你可以看到底部的水平线,或者你看不到它,因为你绘制的不是底部像素中心,而是底部像素行的底部边界。一个实现可能会解决这个问题。这就是您在 x=0 处的左侧垂直线所发生的情况。

因此,您只需设置 glOrtho 调用以匹配您要使用的坐标范围,您就会看到正在绘制的线条。

使用glClearColor更改背景颜色。

也不要将 glutInitDisplayMode(GLUT_SINGLE | ...)glutSwapBuffers() 结合使用。要么使用单缓冲,然后没有要交换的缓冲区,要么像我建议的那样,在帧完成后使用双缓冲和交换缓冲区。还要删除那里的 glFlush,如果使用 glutSwapBuffers 则不需要。

另一种画法

 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.0);