如何使用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);
我正在尝试绘制一个如下所示的网格:
但我得到的是:
黑色屏幕,左侧和底部边框有两条橙色线条
这是我的代码:
#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);