gl库是核心库。包含115个函数,函数名前缀为gl
glu库是实用库。包含43个函数,函数名前缀为glu,封装了gl库。
aux库是辅助库。包含31个函数,函数前缀为aux,windows平台下由glaux.dll负责解释实行。在实际中,已经被glut所替代。可以用来绘制网状体和实心体。
glut是实用工具库,具有良好的跨平台性。函数名前缀为glut。目的是隐藏不同平台的API的复杂度。可以在x-window,windows NT,OS/2等系统下运行。这不分函数主要包括
(1)窗口操作函数
窗口初始化,窗口大小,窗口位置
glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()
(2)回调函数
响应刷新消息,键盘消息,鼠标消息,定时器函数等
GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()
(2)创建复杂三维物体,和aux函数库内容相同
glutSolidSphere()、glutWireSphere()
(3)菜单函数
GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()
(4)程序主循环函数
glutMainLoop()
glut工具箱提供几种图形的三维显示函数
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 丝状球
void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球
void glutWireCube(GLdouble size); 丝状立方体
void glutSolidCube(GLdouble size); 实心立方体
void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint nsides, GLint rings); 丝状花环
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint nsides, GLint rings); 实心花环
void glutWireIcosahedron(void); 丝状20面体
void glutSolidIcosahedron(void); 实心20面体
void glutWireOctahedron(void); 丝状8面体
void glutSolidOctahedron(void); 实心8面体
void glutWireTetrahedron(void); 丝状4面体
void glutSolidTetrahedron(void); 实心4面体
void glutWireDodecahedron(GLdouble radius); 丝状12面体
void glutSolidDodecahedron(GLdouble radius); 实心12面体
void glutWireCone(GLdouble radius, GLdouble height, GLint slices,
GLint stacks); 丝状圆锥体
void glutSolidCone(GLdouble radius, GLdouble height, GLint slices,
GLint stacks); 实心圆锥体
void glutWireTeapot(GLdouble size); 丝状茶壶
void glutSolidTeapot(GLdouble size); 实心茶壶
void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 丝状球
void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球
void glutWireCube(GLdouble size); 丝状立方体
void glutSolidCube(GLdouble size); 实心立方体
void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint nsides, GLint rings); 丝状花环
void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint nsides, GLint rings); 实心花环
void glutWireIcosahedron(void); 丝状20面体
void glutSolidIcosahedron(void); 实心20面体
void glutWireOctahedron(void); 丝状8面体
void glutSolidOctahedron(void); 实心8面体
void glutWireTetrahedron(void); 丝状4面体
void glutSolidTetrahedron(void); 实心4面体
void glutWireDodecahedron(GLdouble radius); 丝状12面体
void glutSolidDodecahedron(GLdouble radius); 实心12面体
void glutWireCone(GLdouble radius, GLdouble height, GLint slices,
GLint stacks); 丝状圆锥体
void glutSolidCone(GLdouble radius, GLdouble height, GLint slices,
GLint stacks); 实心圆锥体
void glutWireTeapot(GLdouble size); 丝状茶壶
void glutSolidTeapot(GLdouble size); 实心茶壶
一个简单的例子如下
#include "stdafx.h"
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//前三个参数,相机在世界坐标的位置。(眼睛的位置)
//中间三个参数,相机在世界坐标中对准的位置(眼睛的方向)
//后面三个参数,相机的轴在世界坐标中的方向。(头顶的方向)
gluLookAt(1.0, 4.0, 0, 0.0, 0.0, 0.5, 0.0, 1.0, 0.0);
//立方体的边长。会绘制在原点处,
glutWireCube(3);
//因为开启了双缓冲技术,需要交换缓冲区
glutSwapBuffers();
}
void reshape(int w, int h)
{
//在默认情况下,视口被设置为窗口所占据的矩形。
//如果手动设置,则坐标原点是窗口的左下角
glViewport(0, 0, w, h);
//设置当前的矩阵模式,主要有以下三种模型
//GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理
//主要是指下面对矩阵的操作模式。
//所谓投影,就是指将三维物体投影到二维平面上。然后你需要生成一个矩阵和当前矩阵相乘,形成一个透视的效果
//所谓模型视图,接下来你需要调用lookat的函数指定眼睛的位置和看到的方向
glMatrixMode(GL_PROJECTION);
//重置当前指定的矩阵为单位矩阵
//任何一个模型,视图变换,都会影响当前矩阵的值。如果不进行归位操作,简单理解为将新的物体中心作为矩阵的坐标原点
glLoadIdentity();
//描述了一个平行修剪空间。也就是和透视投影相反,远距离物体不会变小。这种投影一般使用在工程制图上
//参数依次是,左,右,下,上,近,远
glOrtho(-4.0, 4.0, -4.0, 4.0, -4.0, 4.0);
}
void init()
{
//依次是红,绿,蓝,和alpha值。并被归一化在0-1之间。用来清空当前的所有颜色
//清楚颜色缓冲区
glClearColor(1.0, 0, 0, 0);
//确定绘图所使用的颜色
glColor3f(0.0, 1.0, 0.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
//开启了双缓冲技术,双缓冲主要适用于动态画面。如果没有双缓冲技术的话,相当于一边绘画一边显示。可能会造成闪烁
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("cube");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
init();
//主循环
glutMainLoop();
}
GLSL是OpenGL着色语言。OpenGL Shading Language。他们是在GPU上执行的。其和C语言比较类似。shader文件可以动态加载,不需要重新编译。一般是在程序外另外写出shader,让程序进行加载。
sahder的使用流程如下
在OpenGL整个程序的初始化阶段(一般是init()函数),做以下工作。
1、顶点着色程序的源代码和片段作色程序的源代码要分别保存到一个字符数组里面;
2、使用glCreateshader()分别创建一个顶点着色器对象和一个片段着色器对象;
3、使用glShaderSource()分别将顶点着色程序的源代码字符数组绑定到顶点着色器对象,将片段着色程序的源代码字符数组绑定到片段着色器对象;
4、使用glCompileShader()分别编译顶点着色器对象和片段着色器对象;
5、使用glCreaterProgram()创建一个(着色)程序对象;
6、使用glAttachShader()分别将顶点着色器对象和片段着色器对象附加到(着色)程序对象上;
7、使用glLinkProgram()对(着色)程序对象执行链接操作
8、使用glValidateProgram()对(着色)程序对象进行正确性验证
9、最后使用glUseProgram()将OpenGL渲染管道切换到着色器模式,并使用刚才做好的(着色)程序对象。
然后,才可以提交顶点。