概述
OpenGL基础教程
文章目录
- OpenGL基础教程
- 一、OpenGL的组成
- 1、OpenGL库
- 2、OpenGL实用库
- 3、OpenGL辅助库
- 二、OpenGL的工作顺序
- 三、OpenGL的基本语法
- 1、命名规则
- 2、数据类型
- 三、OpenGL程序实例
- 1、头文件包含
- 2、窗口管理
- 四、OpenGL程序的基本结构
- 1、初始化
- 2、设置取景模式
- 1)平行投影:`glOrtho()`
- 2)透视投影:gluPerspective()
- 3)视口变换:`void glViewport();`
- 4)`glOrtho()`和`glViewport()`的关系
- 3、几何变换/光照处理
- 五、OpenGL程序实例——绘制图形
一、OpenGL的组成
1、OpenGL库
-
包括115个基本函数
-
函数以gl开头
例:
glColor3f()
,glTranslate3f()
. -
完成图元的定义、几何变换、投影等功能
2、OpenGL实用库
- 实用函数43个
- 函数以glu开头
例:gluPerspective()
; - 完成更高层的图形处理如曲线曲面的生成、图象操作等
3、OpenGL辅助库
- 包括函数31个
- 函数以aux开头
例:auxInitWindow()
; - 主要用于窗口管理
二、OpenGL的工作顺序
- 构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述。
- 在三维空间上放置对象,选择有利的场景观察点。
- 计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。
- 光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。另外,也可能执行消隐,以及对象素的操作。
三、OpenGL的基本语法
1、命名规则
-
OpenGL函数都遵循一个命名约定,即采用以下格式:
<库前缀><根命今><可选的参数个数><可选的参数类型>
例如函数glColor3f(...)
, gl表示这个函数来自库gl.h,color
表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。 -
void glVertex3fv(Glfloat *vertex)
前缀:
- gI,glu,aux,glut—该函数属于哪个函数库
后缀:
- 2,3,4 — 参数的维数
- b,s,I,f,d,ub,us,ui — 参数的数据类型
- v ---- 以数组方式传递参数
函数名中的单词首写字母大写
2、数据类型
三、OpenGL程序实例
1、头文件包含
-
利用OpenGL实现图形绘制,首先要引入OpenGL核心库以及其他需要使用的库的头文件。
-
GLUT保证了gl.h和glu.h被正确包含。
#include <gl/glut.h> #include <windows.h>
2、窗口管理
- 初始化(glutlnit)
- 创建窗口(glutCreateWindow)
- 设定窗口的显示模式(glutlnitDisplayMode)
- 指定窗口的位置和大小(glutlnitWindowPosition和glutlnitWindowSize)
- 指定窗口的显示内容函数(glutDisplayFunc)
- 运行框架(glutMainLoop)
int main( int argc, char **argv)
{ glutInit( &argc, argv); // GLUT 初始化函数
// 设置窗口大小 (width, height)
glutInitWindowSize(400, 400);
// 设置窗口位置, 从左上角开始
glutInitWindowPosition(200, 100);
// 创建绘制窗口
glutCreateWindow( "Green Triangle");
// 设置绘制回调函数,把一个绘制函数的指针传给系统,
//系统会在需要重绘的时候自动来调用你提供的绘制函数
glutDisplayFunc(display);
init(); // 初始化
glutMainLoop(); // 进入GLUT的主消息循环,直到绘制窗口
// 被关闭时该行代码才执行完毕,进入下一行
return 0; // 程序退出
}
四、OpenGL程序的基本结构
1、初始化
第一部分是初始化部分:
-
主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。
-
这些状态一般都用函数
glEnable()
,glDisable(???)
来设置,???表示特定的状态。
2、设置取景模式
第二部分设置观察坐标系下的取景模式。主要用到两个函数:
1)平行投影:glOrtho()
void glOrtho(left,right,bottom,top,near,far);
设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;
-
设置一个长宽高一定的投影矩阵,通俗点讲就是设置摄影机所能照射的范围。
-
在一个漆黑的舞台上,如果舞台上的物体超出了这个范围那就显示不出来,只有刚好在摄影机照射的范围内才能完全显示。
-
例如:工程图采用的是正交投影:
2)透视投影:gluPerspective()
-
void gluPerspective(fovy,aspect,zNear,zFar)
设置投影方式为透视投影,其取景体积是一个截头锥体,在这
个体积内的物体投影到锥的顶点。例如:火车道,感觉很远处会交于一处(Vanishing point)
3)视口变换:void glViewport();
void glViewport(left,top,right,bottom);
设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示);glViewport
在默认情况下,视口被设置为占据打开窗口的整个像素矩形,窗口大小和设置视口大小相同,所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换,在窗口中定义一个像素矩形,最终将图像映射到这个矩形中。例如可以对窗口区域进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图。
#include "stdafx.h"
#include <math.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include "gl/glut.h“
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
//画分割线,分成四个视见区
glViewport(0, 0, 400, 400);
glBegin(GL_LINES);
glVertex2f(-1.0, 0);
glVertex2f(1.0, 0);
glVertex2f(0.0, -1.0);
glVertex2f(0.0, 1.0);
glEnd();
//定义在左下角的区域
glColor3f(0.0, 1.0, 0.0);
glViewport(0, 0, 200, 200);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
//定义在右上角的区域
glColor3f(0.0, 0.0, 1.0);
glViewport(200, 200, 400, 400);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
//定义在左上角的区域
glColor3f(1.0, 0.0, 0.0);
glViewport(0, 200, 200, 400);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
//定义在右下角
glColor3f(1.0, 1.0, 1.0);
glViewport(200, 0, 400, 200);
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);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
4)glOrtho()
和glViewport()
的关系
假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);
就表示用一个宽高都是3的框把这个球体整个都装了进来。
如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10)
;就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;
glOrtho
函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。
glViewport
主要完成这样的功能。它负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。
-
比如:如果我们使用glut库建立一个窗体:
glutInitWindowSize(500, 500)
; 然后使用glutReshapeFunc(reshape)
;reshape代码如下:
void reshape(int width, int height) { glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixModel(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10); .... }
这样是可以看到一个正常的球体的。
3、几何变换/光照处理
第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。
五、OpenGL程序实例——绘制图形
-
清除当前窗口的内容,以免影响绘图的效果
void glClearColor (red, green, blue, alpha);
-
给定当前屏幕的背景设置颜色,red, green, blue, alpha为RGBA颜色值.
指定窗口背景色( glClearColor)
颜色管理,使用RGB颜色模型。一种颜色用红、绿、蓝三种颜色成分混合而成,每种颜色成分使用0.0到1.0之间的任意有效浮点数来表示颜色值。
接下来的内容参考OpenGL入门教程
最后
以上就是唠叨糖豆为你收集整理的OpenGL基础教程的全部内容,希望文章能够帮你解决OpenGL基础教程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复