openGL介绍
opengl使用手册 简书

OpenGL(Open Graphics Library)是一种用于渲染2D和3D图形的跨平台图形API。
OpenGL提供了一系列的函数,可以用来配置图形环境、绘制几何图形、处理纹理、执行变换等。
以下是一个简要的OpenGL使用手册的概述:1. 初始化OpenGL环境:-创建OpenGL上下文,配置窗口和视口,初始化OpenGL的各种参数。
2. 设置投影和视图矩阵:-使用OpenGL的矩阵操作函数,设置投影矩阵和视图矩阵,定义场景中物体的可见范围和视图。
3. 创建和加载着色器:-编写顶点着色器和片元着色器,将它们编译成着色器程序,并链接到OpenGL上下文。
4. 创建和绑定缓冲区对象:-创建顶点缓冲对象(VBO)和索引缓冲对象(IBO)来存储顶点数据和索引数据。
5. 定义顶点数据和绘制图形:-定义顶点数据,将数据传递到缓冲区对象中,使用OpenGL函数绘制图形。
6. 处理纹理:-加载纹理图像,创建纹理对象,将纹理数据传递到GPU,使用纹理进行图形渲染。
7. 执行变换:-使用OpenGL的矩阵操作函数,对物体进行平移、旋转、缩放等变换。
8. 设置光照和材质:-配置光源和材质属性,实现光照效果。
9. 深度测试和遮挡剔除:-启用深度测试和遮挡剔除,以处理物体的深度关系和遮挡关系。
10. 处理用户输入:-处理用户输入,例如键盘和鼠标事件,以交互式地改变场景。
11. 错误处理:-添加错误检查,确保OpenGL函数的调用没有错误,方便调试。
12. 清理和释放资源:-在程序结束时清理和释放分配的OpenGL资源,防止内存泄漏。
13. OpenGL扩展:-了解和使用OpenGL的扩展,以获取更先进的图形特性。
14. 学习资源:-利用OpenGL的学习资源,包括在线教程、书籍和社区,以深入了解图形编程。
请注意,上述步骤是一个简要的概述。
OpenGL是一个庞大而灵活的库,涵盖了广泛的图形编程概念。
深入学习OpenGL需要时间和实践。
OPENGL简介

OpenGL 的特点
从程序开发人员的角度来看,OpenGL是一组绘图命令 的API(Application Program Interface,应用程序接口)集合。 利用这些API能够方便地描述二维和三维几何物体,并 控制这些物体按某种方式绘制到显示缓冲区中。 OpenGL的API集提供了物体描述、平移、旋转、缩放、 光照、纹理、材质、象素、位图、文字、交互以及提 高显示性能等方面的功能,基本涵盖了开发二、三维 图形程序所需的各个方面。与一般的图形开发工具相 比,OpenGL具有以下几个突出特点: 应用广泛 跨平台性 高质量和高性能 出色的编程特性 网络透明性
OpenGL程序结构 ---------------------程序的基本结构
OpenGL程序的基本结构可分为三个部分:
第一部分是初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式 (RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深 度检验,裁剪等等。这些状态一般都用函数glEnable(???), glDisable(???)来设置,??? 表示特定的状态。 第二部分设置观察坐标系下的取景模式和取景框位置大小。主要利用了三个函数:
函数void glViewport(left,top,right,bottom):设置在屏幕上的窗口大小,四个参数描述屏 幕窗口四个角上的坐标(以象素表示);
函数void glOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投 影),其取景体积是一个各面均为矩形的六面体; 函数void gluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景 体积是一个截头锥体。
OpenGL简介

OpenGL简介(),Open Graphics Library,开放图形库,是跨语⾔、跨平台的3D图形编程接⼝。
OpenGL使⽤客户端 - 服务器架构设计,应⽤程序为客户端,图形硬件设备为服务器。
客户端负责提交OpenGL命令,服务器执⾏这些命令并渲染出图像。
OpenGL是⼀个状态机,每个状态都有⼀个默认值。
开发者可以设置这些状态,然后让它们⼀直⽣效,直到再次修改它们。
例如:当前颜⾊就是⼀个状态变量,可以把其设置成红⾊,那么在此之后绘制的所有物体都会使⽤这种颜⾊,直到再次把当前颜⾊设置为其他颜⾊。
OpenGL的API可通过软件模拟实现,⾼效实现依赖于显⽰设备⼚商提供的硬件加速。
注:开源()是⼀个纯软件模拟实现的图形API,其代码兼容于OpenGL。
OpenGL规范⽬前由⾮盈利组织()的架构评审委员会(Architecture Review Board,ARB)维护。
ARB主要由操作系统⼚商(Apple Computer、Microsoft【2003.3已退出】等)、图形硬件⼚商(3Dlabs、SGI、NVIDIA、ATI Technologies、Intel等)、技术公司(Mozilla、Google等)和国际3D组织组成。
OpenGL是⼀个不断进化的API,在OpenGL1.2.1版本引⼊扩展(extension)的概念。
OpenGL新版本会定期由Khronos Group发布。
①增加新的扩展API(引⼊新函数和新常量)来增加新功能②放松或取消现有扩展API的限制来增强功能⼀个扩展由两部分组成:包含扩展函数原型的头⽂件和⼚商的设备驱动实现ARB扩展:标准扩展。
由架构评审委员ARB批准发布。
第⼀个ARB扩展是GL_ARB_multitexture(注:在OpenGL1.3中加⼊)。
所有ARB 扩展可从查询。
GL_ARB_multitexture扩展中新增了包含glActiveTextureARB、glClientActiveTextureARB、glMultiTexCoord*ARB函数,共34个。
opengl 原理

opengl 原理OpenGL是一种图形编程接口,使得开发者可以利用硬件加速来绘制2D和3D图形。
它提供了一系列函数和状态机,使用C语言进行编程。
OpenGL的工作原理如下:1. 初始化:在使用OpenGL之前,需要先初始化OpenGL环境。
这包括创建图形上下文、加载图形驱动程序、设置显示设备等操作。
2. 设置状态:OpenGL使用一系列状态来控制绘制过程。
这些状态可以包括清除颜色缓冲区的颜色、设置深度测试、开启光照等。
开发者可以利用OpenGL提供的函数来设置这些状态。
3. 创建对象:在OpenGL中,开发者需要创建对象来表示物体或场景。
常用的对象包括顶点数组对象(Vertex Array Object,VAO)和顶点缓冲对象(Vertex Buffer Object,VBO)。
这些对象用于存储顶点数据、纹理坐标等信息。
4. 编写着色器:OpenGL使用着色器来控制顶点和片段(像素)的处理过程。
开发者需要编写顶点着色器和片段着色器,并将它们编译为可执行的着色器程序。
顶点着色器用于处理顶点数据,而片段着色器用于处理像素数据。
5. 绘制物体:在绘制物体之前,需要将顶点数据、纹理坐标等信息传递给OpenGL。
开发者可以使用VAO和VBO来管理这些数据。
然后,利用着色器程序和绘制命令(如glDrawArrays 和glDrawElements)来执行绘制操作。
6. 渲染:在绘制完成后,OpenGL会对图形进行渲染。
这包括执行光栅化过程(将几何图形转换为像素)和颜色插值等操作。
最终,渲染结果将会显示在屏幕上。
7. 清理:在使用完OpenGL之后,需要进行清理操作,释放资源。
这包括删除VAO和VBO对象、卸载着色器程序、关闭OpenGL环境等。
总结起来,OpenGL的工作原理涵盖了环境初始化、状态设置、对象创建、着色器编写、物体绘制、渲染和清理等步骤。
通过合理地利用这些步骤,开发者可以实现高效的图形编程。
opengl面试题

opengl面试题OpenGL(Open Graphics Library)是一种跨平台的图形程序接口,被广泛应用于计算机图形学、游戏开发和虚拟现实等领域。
在面试中,对于应聘者来说,熟悉和掌握OpenGL相关知识是非常重要的。
本文将针对OpenGL面试题,从基础知识到高级概念进行详细讲解。
一、OpenGL基础知识1. 什么是OpenGL?OpenGL是一种开放的、跨平台的图形程序接口,由一系列函数库组成,用于渲染2D和3D图形。
它提供了丰富的绘图函数和状态管理函数,可以用于创建和操控渲染管线,实现图形的绘制、变换、光照等操作。
2. OpenGL的版本有哪些?它们之间有何区别?OpenGL的版本包括OpenGL 1.0、OpenGL 2.0、OpenGL 3.0、OpenGL 4.0等。
每个版本都有自己特定的功能和特性,新版本通常会引入更强大的功能和更高效的实现方式。
主要的区别在于对硬件和图形特性的支持程度上有所不同。
3. 什么是渲染管线?渲染管线是OpenGL中的一个重要概念,它描述了图形的处理过程。
渲染管线包括几个阶段,如顶点处理、光栅化、片段处理等。
每个阶段都有特定的功能和输入输出。
熟悉渲染管线的工作原理是理解OpenGL的关键。
4. 什么是顶点缓冲对象(VBO)?顶点缓冲对象是OpenGL中用于存储顶点数据的缓冲区。
通过创建和绑定VBO,可以将顶点数据传输到显存中,从而提高渲染效率。
VBO可以存储顶点的位置、颜色、纹理坐标等信息。
二、OpenGL高级概念1. 什么是着色器(Shader)?着色器是OpenGL中用于控制图形渲染过程的程序。
着色器分为顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)。
顶点着色器用于处理顶点相关计算,如位置变换、法线变换等;片段着色器用于处理每个像素的光照、纹理采样等操作。
2. 什么是纹理(Texture)?纹理是二维图像的映射,可以应用到模型的表面上。
OpenGL 简介

OpenGL使用
GLUT ( OpenGL Utility Toolkit ) 安装:在windows下通过 C/C++语言编写 GLUT 程序, 需要以下三个文件:
举例:在window XP下使用VC6安装GLUT
– – – –
– GLUT.H - 需要源代码中包含这个文件。通常情况下,这个文件 应该放在系统的包含目录下的 GL 文件夹中。 – GLUT.LIB (SGI windows版本) 以及 glut32.lib (微软版本) - 这 个文件必须被连接到程序中, 确保它放在 LIB 目录中。 – glut32.dll (Windows) 和 glut.dll (SGI Windows版本) - 根据所 使用的OpenGL选择一个,如果正在使用微软公司的版本,那么 必须选择 glut32.dll。应该把DLL放置在系统文件夹中。
OpenGL使用
void main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(50,100); glutInitWindowSize(400,300); glutCreateWindow(“An Example OpenGL Program.”); init(); glutDisplayFunc(lineSegment); glutMainLoop(); }
OpenGL使用
OpenGL使用
OpenGL使用
#include <GL/glut.h> void renderScene(void) { //绘制一个简单的二维的三角形 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glFlush(); } void main(int argc, char **argv) { glutInit(&argc, argv); //初始化glut glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA); //设置窗口的模式-深度缓存,单缓存,颜色模型 glutInitWindowPosition(100,100); //设置窗口的位置 glutInitWindowSize(320,320); //设置窗口的大小 glutCreateWindow(“3D Tech- GLUT Tutorial”); //创建窗口并赋予title glutDisplayFunc(renderScene);//调用renderScene把绘制传送到窗口 glutMainLoop(); //进入循环等待
OpenGL介绍

glaux.h: OpenGL扩展库 glut.h: OpenGL实用工具包 #include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h> #include <GL/glut.h>
此外,OpenGL还提供了反走样技术,能够实现深度暗示(Depth Cue)、运动模糊(Motion Blur)、雾化(Fog)等特殊效果。
6.1.3 OpenGL的绘制流程和原理
点数据 评价器 逐点操作 基元匹配 基片 操作
显示 列表
像素 数据 像素操作
光栅化
帧缓冲区
纹理存储器
OpenGL指令从左侧进入OpenGL,有两类数据,分别是由顶点描述的几何模 型和由像素描述的位图、影像等模型,其中后者经过像素操作后直接进入光栅 化。评价器(Evaluator)用于处理输入的模型数据,例如对顶点进行转换、光照, 并把图元剪切到视景体中,为下一步光栅化做好准备。显示列表(Display List) 用于存储一部分指令,留待合适时间以便于快速处理。光栅化将图元转化成二 维操作,并计算结果图像中每个点的颜色和深度等信息,产生一系列图像的帧 缓存描述值,其生成结果称为基片(Fragment)。基片操作主要的有帧缓存的更 新、测试、融合和屏蔽操作,以及基片之间的逻辑操作和抖动(Dithering)。
第6章 OpenGL
6.1 基本介绍
6.1.1 背景情况
OpenGL(Open Graphics Library,即开放性图形库)是以SGI的 GL三维图形库为基础制定的一个开放式三维图形标准。SGI在 1992年7月发布了1.0版。 OpenGL 规 范 由 ARB(OpenGL Architecture Review Board, OpenGL结构评审委员会)负责管理,目前加入OpenGL ARB的 成员有SGI、Microsoft、Intel、IBM、SUN、Compaq、HP等公 司,它们均采用了OpenGL图形标准,许多软件厂商以OpenGL 为基础开发自己的产品,硬件厂商提供对OpenGL的支持。由 于OpenGL的广泛应用,它已经成为一个工业标准。
OPENGL简介

OPENGL 简 介
glBegin(GL_POLYGON); glBegin(GL_POLYGON); glNormal3fv(n0 glNormal3fv(n0); glVertex3fv(v0 glVertex3fv(v0); glNormal3fv(n1 glNormal3fv(n1); glVertex3fv(v1 glVertex3fv(v1); glNormal3fv(n2 glNormal3fv(n2); glVertex3fv(v2 glVertex3fv(v2); glNormal3fv(n3 glNormal3fv(n3); glVertex3fv(v3 glVertex3fv(v3); glE视图变换 3.视图变换 Void gluLookAt(GLdouble eyey,GLdouble eyez,GLdouble eyex,GLdouble centerx,GLdouble GLdouble
OPENGL 简 介
3. OpenGL程序基本结构 程序基本结构 初始化部分 主要是设置一些OpenGL的状态开关,如颜色模 的状态开关, 主要是设置一些 的状态开关 式的选择,是否作光照处理,深度检验,裁剪等等。 式的选择,是否作光照处理,深度检验,裁剪等等。 这些状态一般都用函数glEnable(???), glDisable(???) 这些状态一般都用函数 来设置, 表示特定的状态。 来设置,???表示特定的状态。 表示特定的状态
OPENGL 简 介
OpenGL基本几何结构 基本几何结构
1. 绘图准备 开始绘在制新图形前, 开始绘在制新图形前,计算机屏幕上可能已有一 些图形,OpenGL在显示缓冲区中存储了那些图形的 些图形, 在显示缓冲区中存储了那些图形的 绘图信息。绘制新的图形以前, 绘图信息。绘制新的图形以前,应当清除当前的这些 内容,以免影响绘图的效果。 内容,以免影响绘图的效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
openGL简单介绍openGL(Open Graphics Library)从本质上说,它是一个3D图形和模型库,具有高度的移植性。
我们可以将openGL看做是一个C运行时的函数库,这个函数库可以帮助我们绘制二维或三维的图像。
静态链接库和动态链接库静态库:lib文件。
编译时代码编译进exe中,会使得程序体积非常庞大。
不利于模块的共享。
优点:不会有dll hell的问题。
好像“企业间的吞并”。
动态库:dll文件。
代码在dll中,其他程序调用dll中的代码,多个程序可以共享。
缺点:dll hell(dll地狱),版本问题。
使用openGL绘制场景的框架:#include <windows.h>#include <gl/glut.h>void RenderScene(void){glClear(GL_COLOR_BUFFER_BIT); //用当前的清除颜色清除窗口glFlush(); //刷新绘图命令}void SetupRC(void) //设置渲染状态{glClearColor(0.0f,0.0f,1.0f,1.0f);//void main(void)int main(int argc,char* argv[]){glutInit(&argc,argv); //对GLUT函数库进行初始化glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA); //创建窗口时使用哪种类型的显示模式glutCreateWindow("simple"); //创建glut窗口glutDisplayFunc(RenderScene); //当窗口被绘制时,调用RenderScene函数SetupRC(); //执行渲染之前应完成的所有OpenGL初始化工作glutMainLoop(); //启动GLUT框架的运行return 0;}使窗口绘制的图形不变形首先,在窗口上绘制一个红色的矩形glColor3f(1.0f,0.0f,0.0f); //设置绘图颜色glRectf(-25.0f,25.0f,25.0f,-25.0f); //绘制填充矩形其次,在主函数中添加glutReshapeFunc(ChangeSize); //当窗口大小改变时,重新设置坐标系统ChangeSize函数的实现:void ChangeSize(GLsizei w,GLsizei h){ GLfloat aspectRatio;if(h==0) h=1; //防止被0所除glViewport(0,0,w,h);//重置投影矩阵堆栈glMatrixMode(GL_PROJECTION);glLoadIdentity(); //在进行变换前把当前矩阵设置为单位矩阵//使正方形不变形的工作aspectRatio=(GLfloat)w/(GLfloat)h;if(w<=h)glOrtho(-100.0,100.0,-100/aspectRatio,100.0/aspectRatio,100.0,-100.0);elseglOrtho(-100.0*aspectRatio,100.0*aspectRatio,-100,100.0,100.0,-100.0);//重置模型视图堆栈glMatrixMode(GL_MODELVIEW);glLoadIdentity();}在窗口中绘制图形基本框架: glBegin(图元) ;glVertex3f(x,y,z);……glEnd();其中,图元可以是点、线、三角形、四边形等。
glVertex3f(x,y,z);表示一个顶点。
如:glBegin(GL_POINTS) ;glVertex3f(0.0f,0.0f,0.0f);glEnd();常用的图元有:GL_POINTS:绘制点GL_LINES:绘制直线GL_LINE_STRIP:绘制线带GL_LINE_LOOP:绘制线环GL_TRIANGLES:绘制三角形GL_TRIANGLE_STRIP:绘制三角形带GL_TRIANGLE_FUN:绘制三角形扇GL_QUADS:绘制四边形如:绘制一个点组成的螺旋线首先,定义符号常量、增加头文件#include <math.h>#define GL_PI 3.1415f其次,绘制螺旋线void RenderScene(void){GLfloat x,y,z,angle;glClear(GL_COLOR_BUFFER_BIT); //用当前的清除颜色清除窗口glColor3f(1.0f,1.0f,0.0f); //设置绘图颜色glBegin(GL_POINTS);z = -50.0f;for(angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f) {x = 50.0f*sin(angle);y = 50.0f*cos(angle);glVertex3f(x, y, z);z += 0.5f;}glEnd();glFlush(); //刷新绘图命令}从各个方向观察这个螺旋线首先,设定两个表示角度的全局变量static GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;其次,在主函数里面增加一个glut函数的调用glutSpecialFunc(SpecialKeys); //设置上下左右键对图形旋转的控制再次,实现SpecialKeys函数如下:void SpecialKeys(int key, int x, int y){if(key == GLUT_KEY_UP)xRot-= 5.0f;if(key == GLUT_KEY_DOWN)xRot += 5.0f;if(key == GLUT_KEY_LEFT)yRot -= 5.0f;if(key == GLUT_KEY_RIGHT)yRot += 5.0f;xRot = (GLfloat)((const int)xRot % 360);yRot = (GLfloat)((const int)yRot % 360);glutPostRedisplay();}最后,在RenderScene函数里增加内容:void RenderScene(void){GLfloat x,y,z,angle;glClear(GL_COLOR_BUFFER_BIT); //用当前的清除颜色清除窗口glColor3f(1.0f,1.0f,0.0f); //设置绘图颜色glPushMatrix();glRotatef(xRot,1.0f,0.0f,0.0f);glRotatef(yRot,0.0f,1.0f,0.0f);glBegin(GL_LINE_STRIP);z = -50.0f;for(angle = 0.0f; angle <= (2.0f*GL_PI)*3.0f; angle += 0.1f) {x = 50.0f*sin(angle);y = 50.0f*cos(angle);glVertex3f(x, y, z);z += 0.5f;}glEnd();glPopMatrix();glFlush(); //刷新绘图命令}第二个例子:绘制彩色立方体深度测试:如果绘制的物体不止一个,那么后绘制的物体总是会在之前绘制物体的前面,这样就有可能影响我们观察的效果。
如果启用了深度测试,则按坐标z的值来进行观察。
z值大,则距离观察者近,反之则远。
透视投影:透视投影执行透视除法,对距离观察者较远的物体进行缩短和收缩。
因此,两个逻辑大小相同的物体分别位于可视区域的前面和后面,前者看上去要比后者大一些。
#include <windows.h>#include <gl/glut.h>// 旋转角度static GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;//透视投影void ChangeSize(int w, int h){GLfloat fAspect;// 防止被0所除if(h == 0) h = 1;// 把视口设置为窗口大小glViewport(0, 0, w, h);fAspect = (GLfloat)w/(GLfloat)h; //实际窗口的纵横比// 重置透视坐标系统glMatrixMode(GL_PROJECTION); //还有一个参数是L_MODELVIEWglLoadIdentity();// 产生透视投影gluPerspective(60.0f, fAspect, 1.0, 4000);//重置模型视图矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void SetupRC(){glEnable(GL_DEPTH_TEST); // 启用深度测试glEnable(GL_COLOR_MATERIAL); //使用不同颜色来贴物体表面 glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); //黑色背景}void SpecialKeys(int key, int x, int y){if(key == GLUT_KEY_UP)xRot-= 5.0f;if(key == GLUT_KEY_DOWN)xRot += 5.0f;if(key == GLUT_KEY_LEFT)yRot -= 5.0f;if(key == GLUT_KEY_RIGHT)yRot += 5.0f;xRot = (GLfloat)((const int)xRot % 360);yRot = (GLfloat)((const int)yRot % 360);glutPostRedisplay();}// 绘制一个立方体void RenderScene(void){float fZ,bZ;// 清空颜色缓冲区和深度缓冲区glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);fZ = 50.0f;bZ = -50.0f;glPushMatrix();glTranslatef(0.0f, 0.0f, -400.0f); //让视图向z轴负方向移动400 glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);glColor3f(1.0f, 0.0f, 0.0f);//绘制立方体glBegin(GL_QUADS);// 正面,红色glVertex3f(-50.0f, 50.0f, fZ);glVertex3f(-50.0f, -50.0f, fZ);glVertex3f(50.0f, -50.0f, fZ);glVertex3f(50.0f,50.0f,fZ);//左面,蓝色glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(-50.0f, 50.0f, bZ);glVertex3f(-50.0f, -50.0f, bZ);glVertex3f(-50.0f, -50.0f, fZ);glVertex3f(-50.0f, 50.0f,fZ);// 右面,绿色glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(50.0f, 50.0f, fZ);glVertex3f(50.0f, -50.0f, fZ);glVertex3f(50.0f, -50.0f, bZ);glVertex3f(50.0f, 50.0f,bZ);// 反面,土黄色glColor3f(0.5f, 0.5f, 0.0f);glVertex3f(50.0f, 50.0f, bZ);glVertex3f(50.0f, -50.0f, bZ);glVertex3f(-50.0f, -50.0f, bZ);glVertex3f(-50.0f, 50.0f,bZ);//顶面,黄色glColor3f(1.0f, 1.0f, 0.0f);glVertex3f(-50.0f, 50.0f, bZ);glVertex3f(-50.0f, 50.0f, fZ);glVertex3f(50.0f, 50.0f, fZ);glVertex3f(50.0f, 50.0f, bZ);// 底面,暗蓝色glColor3f(0.0f, 0.5f, 0.5f);glVertex3f(-50.0f, -50.0f, fZ);glVertex3f(-50.0f, -50.0f, bZ);glVertex3f(50.0f, -50.0f, bZ);glVertex3f(50.0f, -50.0f,fZ);glEnd();glPopMatrix();//交换缓冲区glutSwapBuffers();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600);glutCreateWindow("Orthographic Projection");glutReshapeFunc(ChangeSize);glutSpecialFunc(SpecialKeys);glutDisplayFunc(RenderScene);SetupRC();glutMainLoop();return 0;}第三个例子:太阳、地球、月球首先,我们绘制三个球体,RenderScene函数如下:void RenderScene(void){static float fMoonRot=0.0f;static float fEarthRot=0.0f;// 清除颜色和深度缓冲区glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();//把整个场景移动到视图中glTranslatef(0.0f,0.0f,-300.0f);//设置材料颜色,太阳为黄色glColor3ub(255,255,0);glutSolidSphere(20.0f,20.0f,20.0f);//绘制地球glColor3ub(0, 0, 255);glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);//绕y轴旋转坐标系统,使地球围着太阳转glTranslatef(105.0f,0.0f,0.0f); //坐标原点沿x轴移动105glutSolidSphere(15.0f,15.0f,15.0f);// 根据基于地球的坐标进行旋转,并绘制月球glColor3ub(200, 200, 200);glRotatef(fMoonRot, 0.0f, 1.0f, 0.0f);glTranslatef(30.0f,0.0f,0.0f);//坐标原点沿x轴移动30fMoonRot+=15.0f;if(fMoonRot>=365.0f)fMoonRot=0.0f;glutSolidSphere(6.0f,15.0f,15.0f);glPopMatrix(); //回复矩阵状态fEarthRot+=5.0f;if(fEarthRot>=365.0f)fEarthRot=0.0f;//交换缓冲区glutSwapBuffers();}其次我们定义光源强度以及光源位置变量,如下:GLfloat whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };GLfloat lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };再次,我们在SetupRC函数里对光源进行初始化:glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight); //使用whiteLight所指定的环境光glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//0号光源的位置glEnable(GL_LIGHT0);最后,在RenderScene函数中绘制太阳时设置光源:glColor3ub(255,255,0);glDisable(GL_LIGHTING);glutSolidSphere(20.0f,20.0f,20.0f);glEnable(GL_LIGHTING);glLightfv(GL_LIGHT0,GL_POSITION,lightPos);制作动画效果首先,在main函数里添加:glutTimerFunc(250, TimerFunc, 1);其次,添加TimerFunc代码如下:void TimerFunc(int value){glutPostRedisplay();glutTimerFunc(100, TimerFunc, 1);}总之,用openGL绘图,分为四个步骤绘制模型、填充颜色/贴图、设置灯光、制作动画参考网站:/。