OpenGL(一)二维图形的绘制:一个简单的绘制矩形程序

一段简单的绘制正方形的程序:

#include <gl/glut.h>

void display()
{
    
    
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5,-0.5);
	glVertex2f(-0.5,0.5);
	glVertex2f(0.5,0.5);
	glVertex2f(0.5,-0.5);
	glEnd();

	glFlush();
}

int main(int argc,char**argv)
{
    
    
	glutInit(&argc,argv);
	glutCreateWindow("test");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

运行之后可以得到这样的结果
在这里插入图片描述

上述程序中main()负责OpenGL的初始化,display()函数定义了要绘制的实体。

首先看main()函数

void glutInit(int* argc,char** argv)

初始化glut,应在其他glut函数和OpenGL函数之前调用。接受main函数的参数。



int glutCreateWindow(char* title)

在屏幕上创建一个窗口,该窗口的标题有title给出。



void glutDisplayFunc(void(*func(void)))

函数func()在每次需要对窗口重绘时被调用。



void glutMainLoop();

使程序进入无限事件处理循环。

在看看display()函数里面的内容

void glClear(GLbitfield mask)

清空mask所指示的所有缓存中的位,得到我们想要的指定的结果。



void glBegin(GLenum mode)

二者之间指定所要绘制的顶点。mode可取GL_POINTS、GL_LINES或GL_POLYGON等等

void glEnd()



glVertex<2,3,4><b i f d>() 描述顶点。可以有多种形式,也可以用向量,



void glFlush()

强制执行所有OpenGL命令。绘图操作后必须加上这一句。

修改GLUT中的默认值:

void glutInitDisplayMode(unsigned int mode)

设置窗口属性为mode模式,mode取值选项为如颜色模式(GLUT_RGB,GLUT_INDEX)和颜色缓存的缓     存模式(GLUT_SINGLE、GLUT_DOUBLE),默认是RGB和SINGLE。



void glutInitWindowSize(int w,int h)  设置窗口的厨师宽度和高度



void glutInitWindowPosition(int x,int y) 设置窗口的左上角相当于屏幕左上角的位置。

颜色的设置:

void glColor3<b i f d....>(r ,g ,b)

void glColor3<b i f d....>v(color)              //设置绘制颜色



void glClearColor(r ,g ,b, a)      //指定屏幕清空颜色,设置后需调用glClear()方能生效

OpenGL和GLUT坐标系统的差异

OpenGL中,x轴和y轴的正方向分别是向上和向右,GLUT中则是向下和向右。

二维取景

void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)

指定一个二维剪裁区域,左下角坐标为(left,bottom),右上角坐标为(right,top)。位于窗口内的对象是可见的,落在窗口之外的对象则不可将,我们称其“被剪裁”。

视口

用视口来限制OpenGL仅在屏幕窗口的任一部分进行绘制。

void glViewport(GLint x,GLint y,GLsizei w,GLsizei h)

将视口的宽度设为w,高度设为h,坐下角坐标为(x,y)。

坐标系统与变换

对象坐标系或世界坐标系:开发人员使用的正是这种坐标系。可自己选定何种单位

窗口坐标系或屏幕坐标系:单位为像素。由物理显示器的属性和显示器的区域两方面决定。



OpenGL中的坐标系变换由两个矩阵决定:

1、模糊视图矩阵        2、投影视图矩阵

函数gluOrtho2D()用于为二维应用程序指定一个投影矩阵



设置这两种矩阵的典型步骤包括:

1、指定我们希望修改的矩阵。

2.将矩阵重置为单位矩阵,

3、修改当前矩阵为用户所期望的矩阵。



glMatrixMode(GL_PROJECTION)

glLoadIndentity();

gluOrtho2D(-1.0,1.0,-1.0,1.0);

完善开始的那段程序:

#include <gl/glut.h>

void init()
{
glClearColor(0.0,0.0,0.0,0.0); //指定屏幕背景为黑色

glColor3f(1.0,1.0,1.0);             //设置绘制颜色为白色


glMatrixMode(GL_PROJECTION);       //指定希望修改的矩阵为投影矩阵
glLoadIdentity();                  //重置为单位矩阵
gluOrtho2D(-1.0,1.0,-1.0,1.0);     //设置二维剪裁区域,左下角坐标为(-1,1),右上角坐标为(1,1)

}

void display()
{
glClear(GL_COLOR_BUFFER_BIT); //清理屏幕颜色为我们指定的颜色

glBegin(GL_POLYGON);              //绘制模式为凸多边形
glVertex2f(-0.5,-0.5);
glVertex2f(-0.5,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,-0.5);             //指定绘制的四个顶点
glEnd();                          

glFlush();                       //强制以上绘图操作执行

}

int main(int argc,char**argv)
{
glutInit(&argc,argv); //初始化glut
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置窗口模式为单缓冲和RGB模式
glutInitWindowSize(500,500); //设置窗口大小
glutCreateWindow(“test”); //设置窗口标题
glutDisplayFunc(display); //设置绘图回调函数
glutMainLoop(); //开始循环,等待响应
init();
return 0;
}
得到如下结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40618238/article/details/103544316