用OpenGL绘制一个红色矩形
实现思路:
利用OPENGL实现图形绘制
1、头文件包含
因为OPENGL没有包含窗口系统,所以需要通过头文件引入窗口系统
#include <Windows.h> //in windows operation system
//#include <gl/GL.h>
//#include <gl/GLU.h>
//can use #include <gl/glut.h> to replace the two lines above as follows
#include <gl/glut.h>
2、使用GLUT库实现窗口管理
glutInit(&argc, argv); //init glut
1)创建窗口之前使用该函数设定窗口的显示模式,包括缓存和颜色模型
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //使用单缓存和RGB颜色模型
2)创建窗口时,系统可使用默认值设定显示窗口的大小和位置,也可通过如下方式实现自定义
glutInitWindowSize(400, 300);
glutInitWindowPosition(100,120);
3)创建窗口
glutCreateWindow("窗口名");
4)定义窗口显示的内容 显示窗口的图形因为屏幕的刷新而不断地被重绘
glutDisplayFunc(Display);
//glutDisplayFunc指定了Display函数作为每次窗口重绘时调用的函数,因此也将Display函数称为显示回调函数
5)使得窗口框架运行起来,使设置的显示回调函数开始工作,直到用户终止程序为止
glutMainLoop();
3、使用OpenGL绘图
1)指定窗口的背景颜色,下面指定窗口的背景色为白色。
glClearColor(1.0f,1.0f,1.0f,1.0f);
//前三个变量指定颜色的红绿蓝三个颜色分量,最后一个参数是颜色的Alpha成分,用于指定颜色混合后的特殊效果,如 半透明效果。
//当该参数(最后一个参数)被激活时,Alpha值为0.0表示对象是完全透明的,1.0表示对象是完全不透明的。由于没有使用混合参数,所以这个值不起作用,可以简单的设为1.0
2)用glClearColor函数中的指定的值设定为颜色缓存中的值
glClear(GL_COLOR_BUFFER_BIT); //即将窗口中每个像素的颜色设为背景颜色
3)除了设定背景颜色,还可以使用glColor()函数设定绘制图形的颜色,其参数与glClearColor()相似
4)绘制图形前需要一个投影过程将三维图形投影到显示窗口中,下面语句设定投影参数
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 200.0, 0.0, 150.0);//指定使用正投影将x(0,200)y(0,150)这样一个矩形坐标区域投影到窗口内
5)利用函数绘制矩形
glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个左上角在(50,100)右下角在(150,50)的矩形
将这三个过程组合起来,将所有的初始化过程及只需要调用一次的函数放在函数Initial()中,将图形绘制过程放在Display()中
完整的程序:
#include <Windows.h>
#include <gl/glut.h>
void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0f, 200.0f, 0.0f, 150.0f);
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f); //设定绘制图形的颜色
glRectf(50.0f,100.0f,150.0f,50.0f);
glFlush(); //用于清空OPENGL命令缓冲区,强制执行命令缓冲区中所有的OPENGL函数
}
int main(int argc , char* argv[])
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 300);
glutInitWindowPosition(100, 120);
glutCreateWindow("redRect"); //要放到glutDisplayFunc(Display)的前面
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return 0;
}
遇到的问题描述:
自己遇到了一个问题,就是将 glutCreateWindow(“redRect”); 放到了glutDisplayFunc(Display); 后面,
然后就导致了这样的异常
原因分析:
其实这个是个很小的问题,只要细致一点就不会出错,绘制函数自然要放到窗口创建之后才合适
解决方案:
调换过来即可
程序的运行效果如下:
总结:
自己通过学习案例,终于写出了第一个OpenGL程序,真的很开心,也希望能给新学这个的人有一些微小的帮助,存在着许多不足,希望大家批评指正,感谢大家的阅读。