首页 > 代码库 > OpenGL学习(一)一个简单的绘制矩形程序

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

运行之后可以得到这样的结果

wKioL1P8RIbTAALXAAByBAZJdGI928.jpg


上述程序中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;
}
得到如下结果:

wKiom1P8VRODsICHAACjNjb3bX0222.jpg


OpenGL学习(一)一个简单的绘制矩形程序