基本概念
1,OpenGL:是图形硬件的一种软件接口。通俗点讲就是一套API,调用接口而已,用于图像的渲染。与微软的Direct类似,不过它是跨平台的。
2,OpenGL渲染管线:是指从调用OpenGL图形程序到图形最终渲染到屏幕的实现过程。其实就是OpenGL底层代码执行的一个流程。具体流程是这样的:它首先是一个CS的架构模式,它的程序允许通过网络运行,运行图形程序并发出绘图命令的计算机称为客户机(类似发送者,就是处理逻辑代码与调用API,一般由cpu执行),接收这些命令并执行绘图任务的计算机称为服务器(类似接收者,通过客服端发来的命令完成图形渲染,一般由GUP执行)。如果程序并不通过网络运行,那么客户机同时也是服务器。而渲染过程就是cup不停的往缓冲区送逻辑处理数据,GPU再去执行这些数据进行渲染。一般我们最希望的情况就是cup与GPU都在不停的工作,而如果有任何一方有等待,我们把这种情况称为管线停滞。下面贴个服务端操作流程图,如下:
3,GLUT:OpenGL工具库,进一步封装,屏蔽了一些繁琐的操作,简化了窗口,输入等的操作。
4,像素的颜色是储存在一个名为位平面的图形硬件中的,可以采用的储存方式有两种:可以把像素颜色的R,G,B和alpha值直接储存到位平面中,也可以储存一个颜色索引值,用它来引用颜色查找表中的一个颜色项。其实就是一块内存区域被称为颜色缓冲区,通常被计算机所绘制的前一副图像所填充(所以每帧需要清屏)。
5,OpenGL使用的坐标系是右手坐标系,左右手坐标系只有Z的朝向不同,如下图:
示例程序
#include "GLTools.h"
#include "GLShaderManager.h"
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#endif
void display()
{
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲区
glColor3f(1.0, 0.0, 0.0); //设置颜色
glBegin(GL_POLYGON); //绘制多边形
glVertex3f(0.25, 0.25, 0.0); //指定顶点
glVertex3f(0.75, 0.25, 0.0);
glVertex3f(0.75, 0.75, 0.0);
glVertex3f(0.25, 0.75, 0.0);
glEnd();
glFlush(); //让缓冲区中的图像最终显示,而不是一直放在缓冲区等待
}
void init()
{
glClearColor(0.0, 0.0, 1.0, 0.0); //背景颜色
glMatrixMode(GL_PROJECTION); //指定当前矩阵(一般与glLoadIdentity一起使用)
glLoadIdentity(); //重置当前指定的矩阵为单位矩阵,类似于一个复位操作
/*正交投影(Xmin, Xmax, Ymin, Ymax, Zmin, Zmax),参数指定了投影的长方体,
这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。*/
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
int main(int argc,char* argv[])
{
glutInit(&argc, argv); //窗口初始化
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //显示模式:单缓冲,RGB模式
glutInitWindowSize(250, 250); //窗口大小
glutInitWindowPosition(100, 100); //窗口位置
glutCreateWindow("hello"); //窗口标题
init();
glutDisplayFunc(display); //窗口内容改变时重绘的回调函数
glutMainLoop(); //循环
return 0;
}