当前位置:文档之家› opengl简介及实例

opengl简介及实例

opengl简介及实例
opengl简介及实例

C# 实例

OpenGL是图形硬件的一个软件接口,是一种快速、高质量的3D图形软件。它提供了近120个绘制点、线点多边形等3D图形的命令,可以完成绘制物体、变换、光照处理、着色、反走样、融合、雾化、位图和图像、纹理映射、动画等基本操作,通过把这一系列基本操作进行组合,可以构造更复杂的3D物体和描绘丰富多彩、千变万化的客观世界。

C#是以https://www.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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();

GL.gluPerspective(10.0f, aspect_ratio, 0.1f, 100.0f);//等价与glFrustum,创建一个视景体

GL.glMatrixMode(GL.GL_MODELVIEW);

GL.glLoadIdentity();

}

///

/// OnPaint方法处理Paint事件

///

///

protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)

{

base.OnPaint(pevent);

//ToDo:可加入自己的设计代码

}

/************************************************************************/

/* OpenGL初始化*/

/************************************************************************/

protected override void InitGLContext()

{

base.InitGLContext();

GL.glShadeModel(GL.GL_SMOOTH);

GL.glClearColor(1.0f, 1.0f, 1.0f, 0.5f);

GL.glClearDepth(1.0f);

GL.glEnable(GL.GL_DEPTH_TEST);

GL.glDepthFunc(GL.GL_LEQUAL);

GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

double aspect_ratio = (double)Size.Width / (double)Size.Height;

GL.glViewport(0, 0, Size.Width, Size.Height);//视口大小

GL.glMatrixMode(GL.GL_PROJECTION);

GL.glLoadIdentity();

GL.gluPerspective(10.0f, aspect_ratio, 0.1f, 100.0f);//等价与glFrustum,创建一个视景体

GL.glMatrixMode(GL.GL_MODELVIEW);

GL.glLoadIdentity();

}

public override void glDraw()

{

GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存

GL.glLoadIdentity();

GLLight();//设置灯光

GL.gluLookAt(xzq_eyeX, xzq_eyeY, xzq_eyeZ, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);//设置视图变换

// GL.glColor3f(0.5f, 0.0f, 0.0f);

//DrawSphere();

DrawCylinder();

//DrawCube();

GL.glFlush(); // Flush The GL Pipeline

}

public void GLLight()

{

float[] ambient = { 1.0f, 1.0f, 0.0f, 1.0f };

float[] diffuse = { 1.0f, 1.0f, 1.0f, 1.0f };

float[] specular = { 1.0f, 1.0f, 1.0f, 1.0f };

float[] position = { 1.0f, 1.0f, 1.0f, 0.0f };

GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient);

GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuse); GL.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, specular);

GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position); GL.glEnable(GL.GL_LIGHT0); GL.glEnable(GL.GL_LIGHTING);

}

public void DrawCylinder()

{

GLUquadric hdc0 = GL.gluNewQuadric();

GL.gluSphere(hdc0, 0.2, 38, 38);

GL.gluDeleteQuadric(hdc0);

GLUquadric hdc = GL.gluNewQuadric();

GL.gluCylinder(hdc, 0.1, 0.1, 1.0, 16, 16);

GL.gluDeleteQuadric(hdc);

GL.glTranslatef(0.0f, 0.0f, 1.0f);

GLUquadric hdc1 = GL.gluNewQuadric();

GL.gluCylinder(hdc1, 0.2, 0.0, 0.4, 16, 16);

GL.gluDeleteQuadric(hdc1);

GL.glTranslatef(0.0f, 0.0f, -1.0f);

GL.glRotatef(-90, 1.0f, 0.0f, 0.0f);

GLUquadric hdc2 = GL.gluNewQuadric();

GL.gluCylinder(hdc2, 0.1, 0.1, 1.0, 16, 16);

GL.gluDeleteQuadric(hdc2);

GL.glTranslatef(0.0f, 0.0f, 1.0f);

GLUquadric hdc3 = GL.gluNewQuadric();

GL.gluCylinder(hdc3, 0.2, 0.0, 0.4, 16, 16);

GL.gluDeleteQuadric(hdc3);

GL.glTranslatef(0.0f, 0.0f, -1.0f);

GL.glRotatef(-90, 0.0f, 1.0f, 0.0f);

GLUquadric hdc4 = GL.gluNewQuadric();

GL.gluCylinder(hdc4, 0.1, 0.1, 1.0, 16, 16);

GL.gluDeleteQuadric(hdc4);

GL.glTranslatef(0.0f, 0.0f, 1.0f);

GLUquadric hdc5 = GL.gluNewQuadric();

GL.gluCylinder(hdc5, 0.2, 0.0, 0.4, 16, 16);

GL.gluDeleteQuadric(hdc5);

GL.glTranslatef(0.0f, -1.0f, 0.0f);

}

}

}

3、Form1.cs文件改为:

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/0814198675.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace OpenGL03

{

public partial class Form1 : Form

{

xzqOpenGLClass xzqGLView = new xzqOpenGLClass();

public Form1()

{

InitializeComponent();

this.ClientSize = new System.Drawing.Size(500, 500);

xzqGLView.xzq_T = -0.0f;

xzqGLView.xzq_eyeX = 20.0f;

xzqGLView.xzq_eyeY = 20.0f;

xzqGLView.xzq_eyeZ = 20.0f;

xzqGLView.Parent = this;

xzqGLView.BringToFront();

xzqGLView.Dock = DockStyle.Fill;

this.Controls.Add(xzqGLView);

}

}

}

4、编译运行效果

C# 实例2

开始的步骤基本上是一样的,只说正文了哈!

1using System;

2using System.Windows.Forms;

3using System.Drawing;

4using CsGL.OpenGL;

5using CsGL.Util;

6

7namespace TestOpenGL

8 {

9///

10///

11/// ** .NET(C#) 中使用 CsGL-OpenGL .NET** 12///

13/// File: FirstOpenGL.cs

14///

15/// Author: 周振兴 (Zxjay 飘遥)

16///

17/// E-Mail: tda7264@https://www.doczj.com/doc/0814198675.html,

18///

19/// Date: 07-05-23

20///

21/// Blog: https://www.doczj.com/doc/0814198675.html,

22///

23///

24public class FirstOpenGl : Form

25 {

26///

27/// FirstOpenGl 的构造方法

28///

29public FirstOpenGl()

30 {

31this.Text = "First OpenGL!";

32this.MaximizeBox = false;

33this.FormBorderStyle = FormBorderStyle.Fixed3D;

34this.Size = new Size(400, 420);

35 }

36

37///

38///初始化 Bitmap

39///

40/// Bitmap

41private Bitmap InitBitMap()

42 {

43 Bitmap bmp = new Bitmap(400, 400);

44 Graphics g = Graphics.FromImage(bmp);

45 GDIGLContext gdictxt = new GDIGLContext(g);

46

47 gdictxt.Create(new DisplayType(DisplayFlags.DRAW_TO_B ITMAP, true), null);

48 gdictxt.Grab();

49

50 GLTest gl = new GLTest();

51 gl.Init();

52 gl.Draw();

53 GL.glFinish();

54

55 gdictxt.Dispose();

56 g.Dispose();

57

58return bmp;

59 }

60

61///

62///重写 Form 的 OnPaint 方法,在其上绘制位图

63///

64///

65protected override void OnPaint(PaintEventArgs e)

66 {

67 Graphics g = e.Graphics;

68 g.DrawImage(InitBitMap(), new Rectangle(0, 0, 400, 40 0));

69base.OnPaint(e);

70 }

71

72///

73///程序的入口

74///

75public static void Main()

76 {

77 FirstOpenGl fog = new FirstOpenGl();

78 Application.Run(fog);

79 }

80 }

81

82

83///

84///继承自 System.Object/OSLib/OpenGL/OpenGL_Extension/GLU/GL UT/GL

85///

86public class GLTest : GL

87 {

88public void Init()

89 {

90 glMatrixMode(GL_PROJECTION);

91 gluOrtho2D(-10.0, 10.0, -10.0, 10.0);

92 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

93 glColor3f(1.0f, 0, 0);

94 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

95 glClear(GL_COLOR_BUFFER_BIT);

96 glShadeModel(GL_SMOOTH);

97 }

98

99///

100///绘制位图

101///

102public void Draw()

103 {

104const int NUMBER = 12;

105const int RADIUS = 8;

106double PI = 3.1415;

107 PointF[] pt = new PointF[NUMBER];

108

109for (int i = 0; i < NUMBER; i++)

110 {

111 pt[i].X = (float)(RADIUS * Math.Cos(PI / NUMBER + 2 * PI * i / NUMBER));

112 pt[i].Y = (float)(RADIUS * Math.Sin(PI / NUMBER + 2 * PI * i / NUMBER));

113 }

114

115for (int i = 0; i < NUMBER; i++)

116for (int j = i + 1; j < NUMBER; j++)

117 {

118 glBegin(GL_LINES);

119 glVertex2f(pt[i].X, pt[i].Y);

120 glVertex2f(pt[j].X, pt[j].Y);

121 glEnd();

122 }

123 glFlush();

124 }

opengl简介及实例

C# 实例 OpenGL是图形硬件的一个软件接口,是一种快速、高质量的3D图形软件。它提供了近120个绘制点、线点多边形等3D图形的命令,可以完成绘制物体、变换、光照处理、着色、反走样、融合、雾化、位图和图像、纹理映射、动画等基本操作,通过把这一系列基本操作进行组合,可以构造更复杂的3D物体和描绘丰富多彩、千变万化的客观世界。 C#是以https://www.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.doczj.com/doc/0814198675.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.doczj.com/doc/0814198675.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是在透视投影下的渲染结果。可以看到,平行投影下,四个氢原子(绿色的球体)大小是一样的,而在透视投影下,远处的氢原子要小一些。

相关主题
文本预览
相关文档 最新文档