OpenGL应用编程接口文档
- 格式:doc
- 大小:599.00 KB
- 文档页数:51
OPenGL ES常用API:glClearColor( 0.f, 0.f, 0.f, 1.f ); // 设置模式窗口的背景颜色,颜色采用的是RGBA值glViewport( 0, 0, iScreenWidth, iScreenHeight );//设置视口的大小以及位置,视口:也就是图形最终显示到屏幕的区域,前两个参数是视口的位置,后两个参数是视口的宽和长。
glMatrixMode( GL_PROJECTION ); // 设置矩阵模式为投影矩阵,之后的变换将影响投影矩阵。
OpenGL属于状态管理机制,比如:设置当前矩阵为投影矩阵过后,在没有重新调用glMatrixMode()之前,任何矩阵变换都将影响投影矩阵。
glFrustumf( -1.f, 1.f, -1.f, 1.f, 3.f, 1000.f ); //该函数创建一个透视投影矩阵,其中的参数定义了视景体,可以理解为用相机的时候,眼睛的可视范围。
就像一个三棱锥,参数1、3、5和2、4、6分别定义了近裁面和远裁面的左下和右上的(x、y、z)坐标。
OpenGL 投影有两种模式,一种是透视投影,也就是通过上述函数创建一个三棱锥视景体,这种模式下观看三维模型是近大远小。
另外一种模式是正交模式,视景体是一个平行六面体,离相机的距离不会影响物体的大小。
glMatrixMode( GL_MODELVIEW ); //设置当前矩阵为模式矩阵glVertexpointer( 3, GL_BYTE, 0, vertices ); //指定从哪里存取空间坐标数据OpenGL 一共有8个这样的函数可以存取不同的坐标数据:glColorPointer();glIndexPointer();glNormalPointer();glTexCoordPointer();等glShadeModel( GL_FLAT ); //设置阴影模式为GL_FLAT,默认是GL_SMOOTH阴影模式一共有两种,GL_SMOOTH和GL_FLAT,在有关照的情况下会有不同的效果。
数glTexImage2D()、设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*();特殊效果函数:融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*();光栅化、象素操作函数:如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel();选择与反馈函数:主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer();曲线与曲面的绘制函数:生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*();状态设置与查询函数:glGet*()、glEnable()、glGetError()。
2.OpenGL实用库The OpenGL Utility Library (GLU) 包含有43个函数,函数名的前缀为glu。
OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点、线、面开始。
Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。
此函数由glu.dll来负责解释执行。
OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。
主要包括了以下几种:辅助纹理贴图函数:gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps();坐标转换和投影变换函数:定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和gluUnProject();多边形镶嵌工具:gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()、gluTessVertex()、gluNextContour()、gluEndPolygon();二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric();非均匀有理B样条绘制工具:主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty();错误反馈工具:获取出错信息的字符串gluErrorString()。
opengl使用手册简书【实用版】目录一、OpenGL 简介二、OpenGL 函数库1.核心函数库2.矩阵操作、几何变换和投影变换函数3.扩展库 GLEW三、OpenGL 菜单的使用1.交互式输入设备的处理2.glut 命令与鼠标函数四、总结正文一、OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。
它被广泛应用于游戏开发、计算机辅助设计、虚拟现实等领域。
OpenGL 提供了丰富的函数库,可以实现各种复杂的图形效果。
二、OpenGL 函数库OpenGL 的函数库主要可以分为核心函数库和扩展库。
核心函数库包含了基本的绘图功能,如绘制几何图元、矩阵操作、几何变换和投影变换等。
扩展库 GLEW(GLEW Extension Wrangler Library)则提供了更多的高级功能,如阴影、纹理贴图等。
1.核心函数库核心函数库包含了许多常用的绘图函数,如:- glBegin():开始绘制- glEnd():结束绘制- glVertex():绘制一个顶点- glColor():设置颜色2.矩阵操作、几何变换和投影变换函数OpenGL 提供了丰富的矩阵操作、几何变换和投影变换函数,如:- glPushMatrix():矩阵入栈- glPopMatrix():矩阵出栈- glTranslate():几何变换(平移)- glRotate():几何变换(旋转)- glScale():几何变换(缩放)- gluPerspective():投影变换3.扩展库 GLEWGLEW 是一个方便的扩展库,可以方便地管理 OpenGL 扩展。
它提供了一系列的函数,如:- glewInit():初始化 GLEW- glewGetError():获取 GLEW 错误- glewCreateContext():创建 OpenGL 上下文- glewMakeCurrent():设置当前 OpenGL 上下文三、OpenGL 菜单的使用OpenGL 支持交互式输入设备,如鼠标和键盘。
一、介绍1.1 什么是OpenGL在计算机图形学中,OpenGL是一种应用编程接口(API),用于渲染二维和三维矢量图形。
它提供了一组函数,用于处理复杂的图形任务,如三维建模、渲染和动画制作。
1.2 为何学习OpenGL如果你是一名Python程序员,对图形编程感兴趣,那么学习OpenGL将为你打开全新的视野。
OpenGL具有强大的功能和广泛的应用领域,掌握它可以让你在图形编程领域更加游刃有余。
二、基础知识2.1 安装OpenGL在Python中,你可以使用PyOpenGL库来使用OpenGL。
你可以通过pip安装PyOpenGL库:```pythonpip install PyOpenGL```2.2 准备环境在开始编写OpenGL程序之前,你需要安装Python和OpenGL的开发环境。
确保你的计算机上已经安装了OpenGL的驱动程序,以及Python的开发环境。
2.3 理解OpenGL的基本结构OpenGL程序的基本结构包括初始化、设置视口、加载顶点和片段着色器、渲染和清理缓冲区等步骤。
在编写OpenGL程序之前,你需要了解这些基本结构。
三、绘制图形3.1 绘制三角形在OpenGL中,绘制一个三角形是最基本的图形绘制操作。
你可以通过设置顶点的坐标、颜色等信息,来绘制一个三角形。
3.2 绘制正方形类似地,你可以通过设置顶点的坐标,来绘制一个正方形。
3.3 绘制其他图形除了三角形和正方形,OpenGL还支持绘制更多种类的图形,如圆形、多边形等。
四、使用着色器4.1 顶点着色器在OpenGL中,着色器是一种用来处理图形数据的程序,它可以控制顶点的位置、颜色等属性。
你可以编写自定义的顶点着色器,来实现更加复杂的图形效果。
4.2 片段着色器片段着色器用来处理像素的颜色、光照等属性。
你可以编写自定义的片段着色器,来实现更加真实的图形效果。
五、渲染5.1 渲染到窗口通过设置OpenGL视口,你可以将绘制的图形渲染到窗口中,以实现图形的显示。
OpenGL1 OpenGL 特点1.建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。
2.变换:OpenGL图形库的变换包括基本变换和投影变换。
基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。
其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。
3.颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Inde x)。
4.光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Ligh t)、漫反射光(Diffuse Light)和镜面光(Specular Light)。
材质是用光反射率来表示。
场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
5.纹理映射(Texture Mapping)。
利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
6.位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(Blendi ng)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。
以上三条可使被仿真物更具真实感,增强图形显示的效果。
7.双缓存动画(Double Buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。
从而实现了消隐算法。
2 OpenGL 工作机制∙如何在OpenGL中表示3D物体∙OpenGL 的渲染流水线∙OpenGL中函数的命名规则2.1 OpenGL中3D物体的表示在3D空间中,场景是物体或模型的集合。
在3D图形渲染中,所有的物体都是由三角形构成的。
这是因为一个三角形可以表示一个平面,而3D物体就是由一个或多个平面构成的。
比如下图表示了一个非常复杂的3D地形,它们也不过是由许许多多三角形表示的。
渲染后的地形面貌复杂的地形也是由三角形构成的因此,在OpenGL中,我们只要指定一个或多个三角形,就可以表示任意3D物体。
那么如何指定三角形呢?OpenGL提供三种指定三角形的方法:即单个三角形、三角条形和三角扇形。
指定单个三角形。
这是最简单,最直接的方法。
即调用特定的OpenGL函数,传入三个顶点坐标,指定一个三角形。
如下图:三角条形。
这种方式适合于同时绘制多个三角形,且这些三角形之间至少存在一条公共边。
一个三角条形是在单个三角形的基础上,再指定一个或多个顶点。
这些顶点按照次序同上一顶点一起构成一个新的三角形。
下图演示了这种推进过程。
三角扇形。
三角扇形中,所有顶点按照一个中心点成扇形排列。
如下图,是一个以V1为中心点的三角扇形。
既然使用三角形就可以表示任何图形,为什么还要使用三角条形和三角扇形呢?这是因为在OpenGL渲染流水线中,对于每个顶点都要进行变换运算。
而对于一些连接在一起的三角形组来说,使用三角条形或三角扇形就减少了顶点的数目,这意味着减少了对顶点的运算,因此提高了渲染速度。
例如,上图中第三个三角扇形,该扇形描述了4个三角形。
如果把这四个三角形都一一作为单个三角形传给OpenGL的话,我们需要3*4=12个顶点,而使用了三角扇形之后,我们只使用了6个顶点。
这节约了一半的运算量!2.2 OpenGL 的渲染流水线当我们把要绘制的三角形传给OpenGL之后,OpenGL还要做许多工作以完成3D空间到屏幕的投影。
这一系列的过程被称为OpenGL的渲染流水线。
一般地,OpenGL的渲染流程如下:2.2.1 视图变换当一个场景确定之后,如果我们想移动某个物体,或者要实现场景内的漫游,就必须进行模型视图的变换。
模型视图变换可以根据需要,移动或旋转一个或多个物体。
例如,如果我们想在3D空间中沿着Z轴向前走的话,只需要把所有物体向-Z方向移动n个单位即可。
如果我们要向左看,就应该把所有物体沿着Y轴渲染向右旋转N个角度。
下图演示了这个过程。
2.2.2 背面隐藏在一些封闭的3D物体中,朝着物体内部的面总是不可见的。
对于这些永远不可见的平面,我们可以使用背面隐藏忽略对它的绘制以提高渲染速度。
为了实现背面隐藏,我们在绘制三角形的时候必须注意三角形的绕法。
一般的,OpenGL默认为逆时针缠绕的面是正面。
如下图所示的三角形中,如果把顶点按照V1->V3->V2的顺序传给OpenGL,那么OpenGL就会认为这个三角形朝着屏幕的面是正面。
使用背面隐藏,就要求我们在把图形传给OpenGL的时候要始终遵守正面使用逆时针绕法的规定。
要开启背面隐藏的功能,只需调用函数:glEnable(GL_CULL_FACE);当然,我们也可以改变OpenGL的设置,决定是对物体的正面还是背面进行隐藏。
调用如下函数:glCullFace(GL_FRONT);来隐藏正面,也可调用glCullFace(GL_BACK);来隐藏背面。
2.2.3 光照渲染如果你开启了光照渲染,并且为每个顶点指定了它的法线,在此过程中,OpenGL将根据顶点的法线和光源的位置及性质重新计算顶点的颜色。
使用光照效果可以大大提高画面的真实性。
2.2.4 剪裁剪裁就是把那些不在视见空间,或者一半在可视空间中的物体剔除或剪裁,以保证不该出现在屏幕上的图形就不出现。
2.2.5 投影要把一个3D空间中的物体显示在屏幕上,就要进行投影。
投影又有两种方式:平行投影和透视投影。
在平行投影中,远处的物体和近处的物体是一样大的,这种投影主要运用在计算机辅助设计(CAD)上,由于这种投影没有立体感,所以一般情况下使用透视投影。
在透视投影中,远处的物体会变得较小,因此在透视投影中,可视空间是一个平头截体(或台体)。
下图表明了投影变换的原理。
2.2.6 视见空间变换当3D空间中的图形经过投影成为2D图形之后,我们还要把图形缩放到窗口或屏幕上。
这个过程被称为视见空间变换。
对于一般的游戏来说,视见空间应该是整个屏幕或窗体。
但是视见空间也可以是它的子集。
2.2.7 光栅化当2D图形的所有变换都完成之后,就要把它们栅格化以显示在屏幕上,或保存为BMP 图片。
栅格化其实是把变换得到的2D矢量图转化为位图的过程。
2.2.8 绘制在这一步中,将由Windows GDI把光栅化的图形显示在屏幕上。
2.3 OpenGL的命名规则在OpenGL1.1库中,包含了大约300多个API函数。
为了方便程序员记忆和使用,这些函数都按照一定的规则进行命名。
例如,函数glVertex用于传入顶点数据,而glVertex又有glVertex2i, glVertex3f, glVertex2f, glVertex2d,glVertex3d等变种。
它们各自有什么意义呢?在函数glVertex3i中,"gl"表示当前函数属于OpenGL库。
当然,此前缀如果是"glu",则表示是GLU库(OpenGL辅助库)。
2.4 OpenGL与特定的平台OpenGL被设计为只有输出的,所以它只提供渲染功能。
核心API没有窗口系统、音频、打印、键盘/鼠标或其它输入设备的概念。
虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,允许跨平台开发。
然而,有些整合于原生窗口系统的东西需要允许和宿主系统交互。
这通过下列附加API实现:* GLX - X11(包括透明的网络)* WGL - Microsoft Windows* AGL - Apple MacOS另外,GLUT库能够以可移植的方式提供基本的窗口功能。
2.5 Window NT系统中的OpenGL使用1.NT系统Windows/System32/opengl32.dll存在2.在头文件内加上:#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>3.在集成环境中Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK4.小例子(旋转的正方形)建立win32的普通工程,添入源代码如下:#include"stdafx.h"#include<stdio.h>#include<gl/gl.h>#include<gl/glu.h>#include<gl/glaux.h>static GLfloat spin = 0.0;static GLfloat cx,cy;void CALLBACK renderScene(){glClear(GL_COLOR_BUFFER_BIT); // 清除缓存glPushMatrix(); // 当前矩阵压栈glTranslated(cx,cy,0); // 移动视点glRotatef(spin, 0.0, 0.0, 1.0); // 旋转视点glColor3f(1.0, 0.0, 0.0); // 设置颜色glRectf(-25.0, -25.0, 25.0, 25.0); // 绘制矩形glPopMatrix(); // 还原当前矩阵glFlush(); // 强制命令执行auxSwapBuffers(); // 交换缓存,输出显示void CALLBACK changeSize(GLsizei w, GLsizei h){if (h == 0){h = 1;}if (w == 0){w = 1;}glViewport(0, 0, w, h); // 设置视图尺寸cx = w/2;cy = h/2;glLoadIdentity();if (w <= h){glOrtho(0.0, 250.0, 0.0, 250.0*h/w, 1.0, -1.0); // 设置投影矩阵 cx = 125.0;cy = 125.0*h/w;}else{glOrtho(0.0, 250.0*w/h, 0.0, 250.0, 1.0, -1.0); // 设置投影矩阵 cx = 125.0*w/h;cy = 125.0;}}void CALLBACK spinDisplay(){spin += 2.0;if (spin > 360.0){spin -= 360.0;}renderScene(); // 渲染输出void CALLBACK leftBtnClick(AUX_EVENTREC *event){auxIdleFunc(spinDisplay); // 左键动画}void CALLBACK rightBtnClick(AUX_EVENTREC *event){auxIdleFunc(NULL); // 右键停止动画}int _tmain(int argc, _TCHAR* argv[]){auxInitDisplayMode(AUX_SINGLE|AUX_DOUBLE); // 初始化显示模式auxInitPosition(100,100,250,250); // 初始化显示位置auxInitWindow(_T("My first OpenGL program")); // 初始输出化窗口cx = 125;cy = 125;glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT); // 明暗处理设置auxReshapeFunc(changeSize); // 设置尺寸变化处理函数auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEDOWN, leftBtnClick); // 设置鼠标左键处理函数 auxMouseFunc(AUX_RIGHTBUTTON, AUX_MOUSEDOWN, rightBtnClick); // 设置鼠标右键处理函数 auxMainLoop(renderScene); // 进入主循环printf("Press anykey to return!");getchar();return 0;}OpenGL ES1 OpenGL 特点和桌面Windows的3D应用一样,移动设备也需要API的支持。