OpenGL

OpenGL
OpenGL

OpenGL简介

OpenGL概述

OpenGL即开放性图形库(Open Graphic Library),是一个三维的计算机图形和模型库。它的前身是SGI公司为其图形工作站开发的IRIS GL,为使其能适用于多种硬件,SGI开发了OpenGL,并于1992年7月发布了OpenGL1.0版本。

OpenGL适用于多种硬件平台及操作系统,用户用这个图形库不仅能方便的制作出有极高质量的静止三维彩色图像,还能创建出高质量的动画效果。由于OpenGL在三维真实感图形制作中具有优秀的性能,许多大公司(如Microsoft、IBM、DEC、SUN等)都将其作为自己的图形标准,从而使OpenGL成为了新一代的三维图形工业标准。

OpenGL中的图元绘制

任何复杂的图形模型都是由基本的图元点、线和多边形组成的。

1.点

OpenGL中的点一般是三维的。当应用程序需要生成一个二维顶点时,z坐标自动设为0。在内部计算时,一个三维点以四维齐次坐标(x,y,z,w)表示,w代表对(x,y,z)的缩放系数,默认值是1.0。当w≠0时,实际坐标应为(x/w,y/w,z/w)。

在OpenGL中,与点的绘制有关的函数主要有以下四个:

glVertex{2,3,4}{s i f d}[V](TYPE coords)

功能:

指定一个顶点。

参数说明:

第一对大括号{}中的“2,3,4”代表顶点的维数;第二对大括号{}中的“sifd”用于表示数据类型:短整型、整型、浮点或双精度;第三项[V]可不选,v表示后面括号中的顶点坐标是采用数组指针描述;第四项coords是指用一个数组或用(x,y,z,w)赋顶点坐标。

glBegin(Glenum mode)

功能:

描述一个几何图元顶点序列的开始。

参数说明:

mode指定在函数glBegin()和glEnd()之间的顶点序列所执行的操作。例如GL_POINTS代表单值(即画一个点),GL_LINES代表在每两个顶点间形成线段,GL_POL YGON代表多边形等等。

glEnd()

功能:

与glBegin()函数成对使用,用来标记顶点序列结束。在OpenGL中,所有的图元绘制都是利用这对函数来完成的。

glPointSize(GlfLoatt size)

功能:

设定点的大小。如果没有启动反走样,所绘制的点是一个正方形块,浮点数舍为整数宽度。如果启动反走样,就画一个圆形象素集,边界象素用低的颜色强度绘制,浮点数不进行舍入,从而使所画的点看上去较光滑。

2.线

OpenGL中的线实际上是用线段来显示,用上面介绍的glBegin()、glEnd()函数以及成对的顶点来描述。例如:

glBegin(GL_LINES);

glVertex2f(0.0,0.0);

glVertex2f(5.0,5.0);

glEnd();

上述代码描述了一条由坐标原点到点(1.0,1.0)的一条线段。

3.多边形

多边形指封闭曲线围成的区域。但OpenGL中的多边形有两个限制:多边形的边不允许相交,即确保多边形为简单多边形;多边形为凸多边形,即任意给定多边形内部的两个点,其连线完全在多边形内。有了这些限制后,首先所有的多边形都可以分割为多个凸多边形,其次也方便了硬件加速的实现。

在OpenGL中,多边形的绘制也是用函数glBegin()和glEnd()来完成的。OpenGL中的图形变换

图形变换一般包括平移、旋转和缩放。在计算机上,图形变换是由矩阵乘法来实现的。OpenGL提供了平移、旋转和缩放等函数以及一系列的矩阵操作函数。用户既可以使用OpenGL提供的函数,也可以定义自己的变换函数。

OpenGL中根据变换的不同性质,把变换分为五类:

1.视点变换

视点变换相当于在照相时,改变相机的位置和拍摄方向,来选择所要拍摄的景物或物体。默认状态时,相机和被摄物体均位于场景中的原点位置,并且相机的初始方向指向z轴负向。因此,视点坐标系是遵循左手法则的。

2.模型变换

模型变换相当于确定被摄物体在场景中的摆放方式。在OpenGL中模型变换主要指物体的平移、旋转和缩放。模型变换是在世界坐标系中进行的,该坐标系遵循右手法则,故模型变换就是视点变换的反变换。

3.投影变换

投影变换相当于选择照相机的镜头,它能决定观察范围的大小和物体投影到屏幕上的方式。在OpenGL中,投影变换分为两种,正射投影和透视投影。透视投影方式和我们日常生活中对物体的观察方式是一致的,符合“近大远小”的规则,这种投影方式主要用于创建更逼真的图像;正射投影方式将物体在不改变其相对大小的前提下直接投影到屏幕上,这种投影方式得到的最终图像能反映物体的尺寸,因此主要用于建筑蓝图及

计算机辅助设计中。

4.裁剪变换

裁剪变换是为了满足特殊用户的需求,允许用户定义另外的裁剪平面。

5.视口变换

视口变换相当于确定照片的大小,它指定图像在计算机屏幕上所占的区域,因此通过视口变换就可以确定最终得到的图像的尺寸及位置。视口变换和投影变换相结合决定了景物到计算机屏幕的映射方式。

OpenGL中的颜色模式

计算机屏幕上的颜色值是由红、绿、蓝三种颜色按照一定比例混合得到的,称为RGB 值;有时还需要另一个参数α来共同构成RGBA值。

像素点色彩信息的存储方式称为颜色模式。在OpenGL中,有两种颜色模式:RGBA模式和颜色索引模式。这两种模式都需要为像素点存储一定量的颜色数据,数据量由像素段的位平面数决定。像素点中一个位平面包含一比特数据。若存储在8个位平面中,则每一像素有8比特颜色,即256种颜色。

1.RGBA颜色模式

在RGBA模式下,R、G、B、α组各分配到一定数目m的位平面。位平面中存储的是整数,使用时除以2 m,并转成浮点数。

在该模式下,可用函数glColor*()来设置当前待绘制几何对象的颜色。例如:

void glColor3{b s i f d ub us ui}(TYPE r, TYPE g, TYPE b)

void glColor4{b s i f d ub us ui}(TYPE r, TYPE g, TYPE b, TYPEα)

void glColor3{b s i f d ub us ui}v(TYPE *v)

void glColor4{b s i f d ub us ui} v(TYPE *v)

参数*v是包含RGBA颜色数组的指针。r、g、b分别为红、绿、蓝三种颜色组分。

参数α即是表征融合度的α值。{}内是可选的数据类型。

2.颜色索引模式

颜色索引模式要使用颜色索引表,用户可以自己编制,这个索引表的基本色调只有R、G、B三种。在该模式下,可显示颜色数由颜色映射的尺寸2 n和位平面数目2m确定,即min(2 n,2 m)。

该模式下使用的函数为:

void glIndex{s i f d}(TYPE c);

void glIndex{s i f d}v (TYPE *c);

这些函数用于从颜色索引表中选取颜色。当前颜色索引值存于c中(随函数类型的不同而选取数据类型)。

OpenGL中的光照处理

光照对于三维真实感图形是非常重要的。如果没有光照,所制作的三维图形就没有立体感,和二维图形基本没有区别。

OpenGL把光分成四个独立的部分,即辐射光、环境光、漫反射光、镜面反射光。

辐射光:是最简单的一种成分,它源自发光体,并且不受其它光源的影响。

环境光:有时又称为泛光,它经过环境的多次散射,已经不可能确定其方向,而是好像来自各个方向。环境光作用于物体表面时,将沿各个方向均匀反射。

漫反射光:来自一个方向,但作用于物体表面上后将沿各个方向均匀散射。

镜面反射光:来自特定方向,并沿特定方向离开。

1.光源

OpenGL中定义光源是由函数glLight*()实现的,如下所示:

Void glLight{f, i}{v}(GLenum light, GLennum pname, TYPE param)

功能:

指定光源的各种属性。

参数说明:

light:指定一个光源。可用的值是GL_LIGHTi,其中,0<=i

pname:指定光源参数,例如GL_AMBIENT表示环境光分量的强度,

GL_DIFFUSE表示漫反射光分量的强度等等。

param:是pname所指定光源参数具体的值。

2.材质

OpenGL中的材质定义了物体表面对各种光的反射比率。

材质就是物体的一种属性,表明物体是由怎样的材料构成的。材质用函数glMaterial*()定义。

Void glMaterial {f, i}v (GLenum face, GLenum pname, TYPE parame)

功能:

指定光照计算中的所采用的材料特性。

参数说明:

face:指定物体的面。该参数的值可以为GL_FRONT,GL_BACK和GL_FRONT_AND_BACK,分别指定物体的正面、背面还是同时应用于正反两个表

面。

pname:指定物体的材料参数。例如GL_AMBIENT表示环境光色,GL_DIFFUSE 表示漫反射色等等。

param:是pname所指定材料参数具体的值。

3.光照计算

多边形的顶点在光照条件下的颜色值计算公式如下:

顶点颜色=顶点处的材料辐射+经顶点处材料环境光属性缩放后的全场环境光+来自各光源经衰减处理后的各种成分(环境光、漫反射光和镜面反射光)

在场景中的每个光源都可能对顶点的最终颜色值作出贡献,各光源贡献的和代表了光源对顶点颜色的总体作用。每个光源的贡献可由下述方程得到:

单个光源的贡献=衰减因子×聚光灯效应×(环境光项+漫反射光项+镜面反射光项)

对于定位光源,衰减因子=(k c+k1d+k q d 2)-1,k c是定义的常数衰减因子,k1是定义的一次衰减因子,k q是定义的二次衰减因子,d是光源位置和顶点的距离。对于定向光源,衰减因子为1.0。

OpenGL中的纹理映射

纹理映射可通过指定的方式将纹理图像映射到物体表面,从而实现对真实物体纹理的模拟。但是纹理映射操作仅适用于RGBA模式下。

纹理映射主要包括4个步骤:

1.定义纹理

在OpenGL中,二维纹理的定义是通过函数void glTexImage2D()来实现的,而一维纹理的定义是通过函数void glTexImage1D()来实现的。由于这两个函数的参数较多,且比较复杂,在此就不详细介绍。

2.指定纹理在像素上的应用方式

OpenGL中的纹理映射方式是通过函数void glTexEnv{i,f}[v](GLenum target, GLenum panme, TYPE param )来指定的。其中参数target的唯一取值为GL_TEXTURE_ENV,pname的取值应为GL_TEXTURE_ENV_MODE,而param的三个可能取值GL_DECAL、GL_MODULATE和GL_BLEND则对应于纹理映射的三种方式。

3.启用纹理映射

纹理映射将所选用的纹理像素的分量值和无纹理时物体的颜色值加以运算,得到最终的物体颜色值。纹理映射时采用纹理像素的哪些分量,由纹理定义函数glTexImage *d()的第三个参数指定,它代表所选用的纹理像素的RGBA分量的数目。

4.用纹理坐标和几何坐标绘制场景

纹理坐标可以由1至4个分量组成,分别称为s、t、r和q。在OpenGL中通过函数void glTexCoord{1,2,3,4}{s,i,f,d}[v](TYPE coords)来设定当前的纹理坐标。纹理映射前,纹理坐标将与4×4的当前纹理矩阵相乘,通过纹理矩阵可以实现纹理的平移、旋转和缩放。

为了在场景中的物体上绘制纹理,必须同时给定物体上每个顶点的物体坐标和纹理坐标。物体坐标用来确定变换后顶点在窗口中的绘制位置,纹理坐标则用来确定此顶点所对应当纹理像素值。不同顶点间的纹理坐标通过线形插值得到。关于纹理坐标的具体计算方法不再详细介绍。

结束语

OpenGL是一个功能强大的业界图形标准,要想在短时间内完全掌握它是不可能的。由于时间和精力所限,以上只介绍了OpenGL图形系统的主要内容,对于其它的一些特性,例如效果处理、帧缓存与动画、OpenGL求值器、选择模式与反馈模式等等,都没有提及。虽然本文内容主要是从各种参考书籍上摘抄而来,但是既然已经达到了简单了解一个实际的三维图形系统的目的,那也就不虚此“文”了。

opengl简介及实例

C# 实例 OpenGL是图形硬件的一个软件接口,是一种快速、高质量的3D图形软件。它提供了近120个绘制点、线点多边形等3D图形的命令,可以完成绘制物体、变换、光照处理、着色、反走样、融合、雾化、位图和图像、纹理映射、动画等基本操作,通过把这一系列基本操作进行组合,可以构造更复杂的3D物体和描绘丰富多彩、千变万化的客观世界。 C#是以https://www.360docs.net/doc/8215343287.html,运行库为基础的一种编程语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果,如面向对象、类型安全等,并被寄希望成为微软发布的用于企业编写基于COM+和视窗系统的程序语言中的最好的一种[2]。 与C++相比,C#的语法更加简洁,调试更加容易,且应用程序开发更加快速。把C#和 OpenGL结合起来开发3D应用程序和软件,将显著提高开发效率。 在C#中,程序间的依赖项通过符号而不是文本来控制,因而不使用头文件,而且opengl32.dll以及opengl32.lib等文件也不能像在C++中那样进行部署和引用,所以,无法直接使用OpenGL所提供的图形库。 在C#中通过调用OpenGL 动态链接库文件:csgl.dll和csgl.native.dll实现OpenGL所提供的强大的图形功能。这2个 文件可以从https://www.360docs.net/doc/8215343287.html,网页上获取。 csgl.dll中定义了4个名称空间,即CsGL,CsGL.OpenGL,CsGL.Pointers,CsGL.Util,其中,CsGL.OpenGL定义的4个类OpenGL、GL、GLU、GLUT中封装了几乎所有的OpenGL函数、用户库函数、辅助库函数和实用库函数及常量;类OpenGLControl中定义了OpenGL场景绘制函数,如场景的初始化、场景的绘制函数等;类OpenGLContext中定义了OpenGL环境控制命令,如像素格式、调色板的创建等命令。CsGL.Util定义了键盘、鼠标事件及异常处理等。 为了能够使用这2个文件,先将这2个文件拷贝到系统文件夹%systemroot%╲system32中,然后在项目的属性页对话框中将"引用路径"设置为系统文件夹%systemroot%╲system32,这样C#就可以找到运行/调试应用程序所需要的库文件。 下面是如何在VS2005环境下实现OpneGL建模 C# 实例1 1、新建windows应用程序项目,将csgl.dll和csgl.native.dll两个文件拷贝到.....\bin\debug\文件夹中(可在https://www.360docs.net/doc/8215343287.html,/projects/csgl/files/下载),增加引用csgl.dll,新增类xzqOpenGLClass类。 2、xzqOpenGLClass.cs文件改为: using System; using System.Collections.Generic; using System.Text; using CsGL.OpenGL;//引用CsGL.OpenGL命名空间 namespace OpenGL03 { class xzqOpenGLClass : OpenGLControl { public double xzq_T, xzq_eyeX, xzq_eyeY, xzq_eyeZ; public xzqOpenGLClass() { } protected override void OnSizeChanged(EventArgs e) { double aspect_ratio = (double)Size.Width / (double)Size.Height; GL.glViewport(0, 0, Size.Width, Size.Height);//视口大小 GL.glMatrixMode(GL.GL_PROJECTION); GL.glLoadIdentity();

OpenGL应用编程接口文档

OpenGL 1 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的库函数介绍

OpenGL的库函数介绍 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。 OpenGL库函数的命名方式非常有规律。所有OpenGL函数采用了以下格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于OpenGL那个开发库。从函数名后面中还可以看出需要多少个参数以及参数的类型。I代表int型,f代表float型,d代表double型,u代表无符号整型。例如:glVertex3fv()表示了该函数属于gl库,参数是三个float型参数指针。我们用glVertex*() 来表示这一类函数。 OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从下图可以看出,核心库(gl)是核心,实用库(glu)是对gl的部分封装。窗口库(glx、agl、wgl)是针对不同窗口系统的函数。实用工具库(glut)是跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。 1.OpenGL核心库(GL) 核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。由于许多函数可以接收不同数据类型的参数,因此派生出来的函数原形多达300多个。核心库在Windows平台上的头文件为“GL.H”,库文件为“OPENGL32.LIB”,动态链接库为“OPENGL32.DLL”。核心库可以在所有的OpenGL平台上运行。 核心库中的函数主要分为以下几类: ●基本几何图元的绘制函数:glBegain()、glEnd()、glNormal*()、glVertex*(); ●矩阵操作、几何变换和投影变换的函数:如矩阵入栈函数glPushMatrix(),矩阵出 栈函数glPopMatrix(),装载矩阵函数glLoadMatrix(),矩阵相乘函数glMultMatrix(), 当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数 glTranslate*()、glRotate*()和glScale*(),投影变换函数glOrtho()、glFrustum()和视 口变换函数glViewport(); ●颜色、光照和材质的函数:如设置颜色模式函数glColor*()、glIndex*(),设置光照 效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial(); ●显示列表函数:主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists(); ●纹理映射函数:主要有一维纹理函数glTexImage1D()、二维纹理函数 glTexImage2D()、设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、 glTexEnv*()和glTetCoord*();

使用OpenGL画球体

(计算机图形学)实验报告 实验名称使用OpenGL画球体 实验时间年月日 专业班级学号姓名 成绩教师评语: 一、实验目的 1、了解并学习open GL的编程; 2、掌握在open GL生成图形的基本思想和基本步骤; 3、使用open GL具体生成简单的三维立体图形; 二、实验原理 简单的说,该实验就是使用数学函数与OpenGL库中的函数实现图形的生成,比如生成球的函数为x=sin(thetar)*cos(phir); y=cos(thetar)*cos(phir); z=sin(phir); 之后在对thetar的值进行定义,使其在某一范围内变化。然后面的集合就生成了我们所需要的球体,但是该实验没有进行光照和材质的设定,所以看起来并不像一个立体的球体形状。其间还需要对OpenGL的编程原理和其所包含的库比较了解。 OpenGL核心库:Windows: OpenGL32。大多数Unix/Linux系统:GL库(libGL.a) OpenGL实用库(Utility Library, GLU):利用OpenGL核心库提供一些功能,从而避免重复编写代码,与窗口系统的连接 OpenGL实用工具库(OpenGL Utility ToolkitLibrary, GLUT),提供所有窗口系统的共同功能,打开窗口,从鼠标和键盘获取输入,弹出菜单,事件驱动。代码可以在平台间移植,但是GLUT缺乏在特定平台上优秀工具包所具有的功能滚动条。 函数的功能glVertex3f(x, y, z),属于GL库参数个数,x, y, z为float。在glVertex3fv(p)中注意每部分的大小写,p为指向float的指针。 绝大多数常数采用#define在头文件gl.h, glu.h和glut.h中定义。注意#include 会自动包含其它两个头文件。例如:glBegin(GL_POLYGON);glClear(GL_COLOR_BUFFER_BIT);在头文件中也定义了OpenGL数据类型:GLfloat, GLdouble, … 关于最初建立文件的步骤 创建一个win32 console application类型的workspace文件,创建一个C/C++

OpenGL编程参考手册

OpenGL编程参考手册》(pdf)电子书下载 笃志说明: 《OpenGL编程参考手册》中文pdf版计算机电子书下载,本书不适合OpenGL新手入门,而适合一些已有比较深厚OpenGL基础的人士开发时使用.它更类似一个词典,将所有的OpenGL 记录,分类,仅此而已. 前言 OpenGL是一个图形硬件的软件接口(“GL”即Graphics Library)。这一接口包含了数百个函数,图形程序员可以利用这些函数指定设计高品质的三维彩色图像所需的对象和操作。这些函数中有许多实际上是其他函数的简单变形,因此,实际上它仅包含大约180个左右完全不同的函数。 OpenGL 实用库(OpenGL Utility Library,GLU)和对X窗口系统的OpenGL扩展(OpenGL Extension to the X Window System,GLX)为OpenGL提供了有用的支持特性和完整的OpenGL核心函数集。本书详细介绍了这些函数的功能。书中各章内容如下: 第1章 OpenGL简介 在概念上对OpenGL作了概述。它通过一个高层的模块图来阐述OpenGL所执行的所有主要处理阶段。 第2章命令和例程概述 较详细地阐述了OpenGL对输入数据的处理过程(用点形式来指定一个几何体或用像素形式来定义一幅图像时),并告诉你如何用OpenGL函数来控制这个过程。此外,在本章中还对GLU和GLX函数作了讨论。 第3章命令和例程一览 根据OpenGL命令所完成的功能列举说明了这些命令组。一旦了解了这些命令的功能,你就可以利用这些完整的函数原型作为快速参考。 第4章定义的常量及相关命令 列举了在OpenGL中定义的常量和使用这些常量的命令。

OpenGL完全教程 第一章 初始化OpenGL

OpenGL完全教程 第一章 初始化OpenGL 作者:何咏 日期:2006-2-3 20:47:09 点击:3373 如需转载本文,请声明作者及出处。 第一章初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化。如果你之前使用过GDI,你应该也多多少少了解到GDI 在绘制图形之前要为之创建渲染环境。OpenGL也一样。本章给出的代码,大家可以不必理解其中的具体意义,反正以后每次初始化是使用这个代码即可。 首先,在一个新的应用程序中,我们需要添加对OpenGL库的引用。Delphi已经为我们写好了OpenGL的头文件,因此我们只须直接在单元的uses中添加OpenGL即可: ... uses Windows, Graphics, OpenGL, ... ... 在创建窗口时,应添加如下代码: procedure Form1.Create(Sender:TObject); var DC: HDC; HRC :HGLRC ; pfd:TPIXELFORMATDESCRIPTOR; pixelFormat:integer; begin DC := GetDC(Handle); With pfd do begin nSize:=sizeof(TPIXELFORMATDESCRIPTOR); // size nVersion:=1; // version dwFlags:=PFD_SUPPORT_OPENGL or PFD_DRAW_to_WINDOW or PFD_DOUBLEBUFFER; // support double-buffering iPixelType:=PFD_TYPE_RGBA; // color type cColorBits:=24; // preferred color depth cRedBits:=0; cRedShift:=0; // color bits (ignored) cGreenBits:=0; cGreenShift:=0; cBlueBits:=0; cBlueShift:=0; cAlphaBits:=0; cAlphaShift:=0; // no alpha buffer

使用OpenGL编程实现Bresenham直线扫描转换算法

实验要求: 学习Visual C++ 6.0 集成编程环境的使用,OpenGL编程环境的设置,OpenGL语法及基本函数的使用等基础知识,并编程实现Bresenham直线扫描转换算法,得出相应的输出图形。 源程序: #include void k1() //0

glFlush(); } void k2() //k>1 { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,1.0,0.0); glBegin(GL_POINTS); GLint x1=0,y1=0,x2=200,y2=400; GLint x=x1,y=y1; GLint dx=x2-x1,dy=y2-y1,dT=2*(dx-dy),dS=2*dx; GLint d=2*dx-dy; glV ertex2i(x,y); while(y

_OpenGL入门教程

OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/8215343287.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/8215343287.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/8215343287.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

[已读]OpenGL、OpenGL ES、OpenVG、GLX、EGL简介

OpenGL、OpenGL ES、OpenVG、GLX、EGL简介今天研究了一些和图形处理相关的技术,其中遇到了一些让人费解的缩写,晚上我抽空整理了如下,希望对大家有点帮助。 (1)OpenGL、OpenGL ES、OpenVG: OpenGL是行业领域中最为广泛接纳的2D/3D图形API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL是独立于视窗操作系统或其它操作系统的,亦是网络透明的。OpenGL帮助程序员实现在PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。 OpenGL ES是免授权费的,跨平台的,功能完善的2D和3D图形应用程序接口API,它针对多种嵌入式系统专门设计。它由精心定义的桌面OpenGL子集组成,创造了软件与图形加速间灵活强大的底层交互接口。OpenGL ES包含浮点运算和定点运算系统描述以及EGL 针对便携设备的本地视窗系统规范。OpenGL ES 1.X 面向功能固定的硬件所设计并提供加速支持、图形质量及性能标准。OpenGL ES 2.X 则提供包括遮盖器技术在内的全可编程3D图形算法。说白了,就是OpenGL的子集、可以应用于ES上。 OpenVG是针对诸如Flash和SVG的矢量图形算法库提供底层硬件加速界面的免授权费、跨平台应用程序接口API。OpenVG现仍处于发展阶段,其初始目标主要面向需要高质量矢量图形算法加速技术的便携手持设备,用以在小屏幕设备上实现动人心弦的用户界面和文本显示效果,并支持硬件加速以在极低的处理器功率级别下实现流畅的交互性能。 (2)GLX、EGL: GLX是OpenGL Extension to the X Window System的缩写。它作为x的扩展,是x协议和X server的一部分,已经包含在X server的代码中了。GLX提供了x window system使用的OpenGL接口,允许通过x调用OpenGL库。OpenGL 在使用时,需要与一个实际的窗口系统关联起来。在不同平台上有不同的机制以关联窗口系统,在Windows上是WGL,在Linux 上是GLX,在Apple OS上是AGL等。 EGL则是OpenGL ES在嵌入式平台上(WGL,GLX,AGL)的等价物。EGL假设OS会提供窗口系统,但EGL与平台无关,并不局限于任何特定的窗口系统,所有用到本地窗口系统的地方都用屏蔽指针来处理。我觉得这就是它易于移植的关键。

OPENGL VAO VBO使用步骤

使用VAO VBO的步骤 1、产生VAO void glGenVertexArrays(GLsizei n, GLuint*arrays); n:要产生的VAO对象的数量。 arrays:存放产生的VAO对象的名称。 2、绑定VAO void glBindVertexArray(GLuint array); array:要绑定的顶点数组的名字。 3、产生VBOs void glGenBuffers(GLsizei n, GLuint*buffers); 产生缓冲区对象的名称。 参数含义和glGenVertexArrays类似。 4、绑定VBOs void glBindBuffer(GLenum target, GLuint buffer); 绑定一个缓冲区对象。

target可能取值是:GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER,or GL_PIXEL_UNPACK_BUFFER. 当进行绑定之后,以前的绑定就失效了。 5、给VBO分配数据: void glBufferData(GLenum target, GLsizeiptr size, const GLvoid*data, GLenum usage); target可能取值为:GL_ARRAY_BUFFER(表示顶点数据), GL_ELEMENT_ARRAY_BUFFER(表示索引数 据),GL_PIXEL_PACK_BUFFER(表示从OpenGL获取的的像素数据),or GL_PIXEL_UNPACK_BUFFER(表示传递给OpenGL的像素数据). 参数含义: size:缓冲区对象字节数 data:指针:指向用于拷贝到缓冲区对象的数据。或者是NULL,表示暂时不分配数据。 6、定义存放顶点属性数据的数组: 首先需要启用VAO中对应的顶点属性数组: void glEnableVertexAttribArray(GLuint index); index:指定了需要启用的顶点属性数组的索引

OpenGL入门C++教程

OpenGL入门c++教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/8215343287.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/8215343287.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/8215343287.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。把解压得到的glut.h放到这个文件夹。 3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。

OpenGL讲座

OpenGL讲座 纲领: 1,简介 2,简单概念性教程 3,实例 1,OpenGL简介 简介: OpenGL - 高性能图形算法行业标准 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。支持主流系统平台。一般由硬件平台直接支持。 对比: 对比DirectX OpenGL 只是图形函数库。DirectX 包含图形, 声音, 输入, 网络等模块。 OpenGL稳定,可跨平台使用。DirectX仅能用于Windows系列平台,包括Windows Mobile/CE系列以及XBOX/XBOX360。 OpenGL与DirectX之争 微软,推行Direct3D,冻结OpenGL!两大显示芯片厂商:Ati和nVIDIA(英伟达)。 2,OpenGL SE 简介: OpenGL ES是专为内嵌和移动设备设计的一个2D/3D轻量图形库,它是基于OpenGL API设计的。OpenGL ES 1.0版基于OpenGL 1.3,而OpenGL ES 1.1则是基于OpenGL 1.5的。现在主要由Khronos Group来负责管理OpenGL ES的开发维护。 OpenGL ES目前主要有两个版本:OpenGL ES 1.X和OpenGL ES 2.X 。OpenGL|ES的官方组织是:https://www.360docs.net/doc/8215343287.html,/ 该组织关注于手持和移动平台上的动态媒体编著、播放所需的API,并致力于为这些API建立无限权费用的开放标准。 OpenGL|ES是根据手持及移动平台的特点,对OpenGL 3D图形API标准进行裁剪定制而形成的,因此大多数OpenGL方面的知识都是可以借鉴的。 嵌入式硬件芯片支持,或软件模拟。

OpenGL完整安装手册

OpenGL的完整安装手册要对得起1个财富值 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL 是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/8215343287.html, 下面将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。 我选择Visual Studio 2008和VC6++作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/8215343287.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/8215343287.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹 如果是VC++6,则应该将glut.h复制在“D:\Program Files\MicrosoftVisualStudio\VC98 \Include\GL文件夹”)。

OpenGL的常用接口-2016-10-13

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,在有关照的情况下会有不同的效果。 glClear( GL_COLOR_BUFFER_BIT ); //清除颜色缓存 glLoadIdentity(); //设置当前矩阵为单位矩阵 OpenGL里面的位置大小都是用矩阵来表示的,比如:glScanf()放大或缩小,其实就是用一个矩阵去乘当前的矩阵,为了使变换不受当前矩阵的影响,所以把当前矩阵设置为单位矩阵。 glTranslatex(0, 0, -100 << 16 ); //将坐标向z轴负方向移动100 glColor4f( 1.f, 0.f, 0.f, 1.f ); 设置颜色为红色

OpenGL使用手册.

OpenGL函数使用手册 (一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl、glu、aux、glut、wgl、glx、agl 等等, 1,核心函数库主要可以分为以下几类函数: (1) 绘制基本的几何图元函数。如:glBegain(). (2) 矩阵操作、几何变换和投影变换的函数。如:矩阵入栈 glPushMatrix(),还有矩阵的出栈、转载、相乘,此外还有 几何变换函数glTranslate*(),投影变换函数glOrtho()和 视口变换函数glViewport()等等。 (3) 颜色、光照和材质函数。 (4) 显示列表函数,主要有创建、结束、生成、删除和调用 显示列表的函数glNewList()、glEndList()、 glGenLists()、glDeleteLists()和glCallList()。(5) 纹理映射函数,主要有一维和二维纹理函数,设置纹理 参数、纹理环境和纹理坐标的函数glTexParameter*()、 glTexEnv*()和glTetCoord*()等。 (6) 特殊效果函数。 (7) 选着和反馈函数。 (8) 曲线与曲面的绘制函数。 (9) 状态设置与查询函数。 (10) 光栅化、像素函数。 2,OpenGL实用库(The OpenGL Utility Library)(GLU) 包含有43个函数,函数名的前缀名为glu. (1) 辅助纹理贴图函数。 (2) 坐标转换和投影变换函数。 (3) 多边形镶嵌工具。 (4) 二次曲面绘制工具。

(5) 非均匀有理B样条绘制工具。 (6) 错误反馈工具,获取出错信息的字符串gluErrorString() 3,OpenGL辅助库 包含有31个函数,函数名前缀名为aux 这部分函数提供窗口管理、输入输出处理以及绘制一些简单的三维物体。 4,OpenGL工具库(OpenGL Utility Toolkit) 包含大约30多个函数,函数前缀名为glut,此函数由glut.dll来负责解释执行。 (1) 窗口操作函数。窗口初始化、窗口大小、窗口位置等函 数glutInit() glutInitDisplayMode()、glutInitWindowSize() glutInitWindowPosition()等。 (2) 回调函数。响应刷新消息、键盘消息、鼠标消息、定时 器函数等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、 glutKeyboardFunc()、 glutMouseFunc()。 (3) 创建复杂的三维物体。这些和aux库函数功能相同。如创 建球体glutWireSphere(). (4) 函数菜单 (5) 程序运行函数 glutAttachMenu() 5,16个WGL函数,专门用于OpenGL和Windows窗口系统的联接,其前缀名为wgl。 (1) 绘制上下文函数。 wglCreateContext()、 wglDeleteContext()、wglGetCurrentContent()、 wglGetCurrentDC() wglDeleteContent()等。 (2) 文字和文本处理函数。wglUseFontBitmaps()、 wglUseFontOutlines()。 (3) 覆盖层、地层和主平面处理函数。wglCopyContext()、 wglCreateLayerPlane()、wglDescribeLayerPlane()、wglReakizeLayerPlatte()等。 (4) 其他函数。wglShareLists()、wglGetProcAddress()等。

Opengl混合入门介绍

OpenGL混合入门学习 1、混合是什么 混合是什么呢?就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。混合是一种常用的技巧,通常可以用来实现半透明透明效果。但其实它也是十分灵活的,可以通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象。 为了更好地理解这些概念,我们可以举出一个例子来简要说明。例如,坐在汽车内透过车窗的茶色玻璃看车外的绿树,这些树木的颜色并不是它们本来的绿色,而是透明的茶色与不透明的绿色的混合颜色。也就是说,最终的颜色来源于两部分,一部分来自于玻璃的茶色,另一部分来自于树木的绿色。 2、开启与关闭 要使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可。 要关闭OpenGL的混合功能,只需要调用:glDisable(GL_BLEND);即可。 注意:只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。 (RGBA模式、颜色索引模式的介绍可以参考下面的内容: https://www.360docs.net/doc/8215343287.html,/blog/static/960747352010425923869/) 3、混合原理介绍 前面我们已经提到,混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。 OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。(也可以不是相加,新版本的OpenGL 可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,这里只是入门介绍,不讨论这个了) 下面用数学公式来表达一下这个运算方式。假设: 源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As), 目标颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rd, Gd, Bd, Ad), 设源因子为(Sr, Sg, Sb, Sa), 目标因子为(Dr, Dg, Db, Da)。 则混合产生的新颜色可以表示为: (Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db, As*Sa+Ad*Da) 当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题 4、实现函数介绍 在OpenGL中,由函数gjBlendFunc()来产生这两个融合因子的值。其函数形式为: void glBlendFunc(GLenum sfactor,GLenum dfactor) glBlendFunc有两个参数,前者表示源因子,后者表示目标因子,这也因子都是预定义的宏,下面将详细说明。 5、源因子和目标因子值介绍

OpenGL完全教程 第三章 使用OpenGL绘图

OpenGL完全教程 第三章 使用OpenGL绘图 作者:何咏 日期:2006-2-3 20:50:47 点击:3959 如需转载本文,请声明作者及出处。 第三章 使用OpenGL绘图 从本章开始,我们将正式开始使用OpenGL来绘制图形。学习本章内容,你将发现使用计算机绘制3D图形原来如此容易。你将了解: ?设置可视区域并创建投影 ?在3D空间中绘制基本图元 ?使用深度测试 ?使用背面剔除提高渲染速度 ?将绘制的图形输出到屏幕上 3.1 绘制之前的必要工作 从章节2.1中,你应该了解到,在使用OpenGL绘图之前,我们应该决定使用何种投影方式,设置渲染后的图形应出现在窗口的位置等等。本节中,我们将了解这些步骤的具体实现方法。 3.1.1 设置窗体的视见区域 (View Port) 在OpenGL初始化完成之后,我们应该进行一些视图设置。首先是设定视见区域,即告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。我们调用glViewPort函数来决定视见区域: procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei); 其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。图3.1-1表示了在WindowsGDI中的窗口坐标,而图3.1-2则是OpenGL所定义的窗口坐标。

图3.1-1 WindowsGDI下的窗体坐标图3.1-2 OpenGL所定义的窗体坐标 例如,要设置如图3.1-3中的视见区域,我们应该调用函数: glViewPort(100,100,Width,Height); 图3.1-3 3.1.2 创建投影变换 接下来,我们要设置一种投影变换。投影变换分为平行投影和透视投影。平行投影中,物体无论远近,大小都是一样的,而透视投影则相反。因此,透视投影更像是我们眼睛所看到的景物。但在某些特殊的时候, 平行投影还是有它的作用的,比如3D建摸程序。图3.1-4是甲烷分子模型在平行投影下的渲染结果,而图3.1-5是在透视投影下的渲染结果。可以看到,平行投影下,四个氢原子(绿色的球体)大小是一样的,而在透视投影下,远处的氢原子要小一些。

相关主题
相关文档
最新文档