如何使用OpenGL绘制简单的网格?

4

我正在尝试绘制一个网格,应该看起来像这样:

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

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

1
在2015年已经没有理由再使用单缓冲渲染了,请将“GLUT_SINGLE”更改为“GLUT_DOUBLE”。 - Colonel Thirty Two
将其更改为GLUT_DOUBLE,但没有任何变化。 - razz
你为什么要使用如此小的视景体(通过glOrtho()调用)来处理如此大的WIDTHHEIGHT?你的i步长比视景体大两倍! - genpfault
我完全不懂OpenGL。 - razz
2个回答

4
另一种绘图方式
 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)函数; enter image description here

1
你可以通过增加两个for循环中的值10来增加分辨率(网格数量),并相应地减小xsize和ysize。 - Anil Kumar
glBegin() 和 glEnd()? - nirvanaswap

3
你设置了投影将坐标范围[0,5]映射到屏幕上。然后,你在距离为10个单位的位置画线,所以只显示线y=0。
实际上,图像是与实现相关的。你可能会看到底部的水平线,也可能看不到它,因为你没在下方像素中心绘制,而是在下方像素行的下边界绘制。某些实现可能会将其舍去。这就是在x=0处发生的事情。
所以,你应该只需设置你的glOrtho调用以匹配想要使用的坐标范围,就可以看到你正在绘制的线条。
使用glClearColor更改背景颜色。
同时,不要在glutInitDisplayMode(GLUT_SINGLE | ...)与glutSwapBuffers()组合使用。要么使用单缓冲,那么就没有缓冲区可交换,或者像我建议的那样,使用双缓冲并在一帧完成后交换缓冲区。还要删除那里的glFlush,如果使用glutSwapBuffers,则不需要它。

我将ortho更改为glOrtho(0.0, WIDTH, 0.0, HEIGHT, 0.0, 0.0),但我看到的只有两条线在中间顶部和中间右侧相连,形成一个角落。 - razz
不要使用0.0, 0.0作为近和远参数。如果你设置near==far,glOrtho将会失败,因此你最终得到的是一个恒等矩阵,这与使用glOrtho(-1, 1, -1, 1, 1, -1)是相同的,所以完美地解释了你看到的角落。请使用-1.0f, 1.0f作为最后两个参数。 - derhass
完美,我现在可以看到整个网格了,除了顶部和右侧的边框,我认为我应该增加它们的尺寸,但是背景是黑色的!为什么 glClearColor (1.0, 1.0, 1.0, 1.0) 不起作用? - razz
我在显示函数的顶部添加了 glClear(GL_COLOR_BUFFER_BIT),但是它没有改变任何东西。 - razz
我移除了 glDisable(GL_TEXTURE_2D),然后白色背景出现了。 - razz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接