文档库 最新最全的文档下载
当前位置:文档库 › OpenGL完全教程 第一章 初始化OpenGL

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

OpenGL完全教程 第一章 初始化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

cAccumBits:=0;

cAccumRedBits:=0; // no accumulation buffer,

cAccumGreenBits:=0; // accum bits (ignored)

cAccumBlueBits:=0;

cAccumAlphaBits:=0;

cDepthBits:=16; // depth buffer

cStencilBits:=0; // no stencil buffer

cAuxBuffers:=0; // no auxiliary buffers

iLayerType:=PFD_MAIN_PLANE; // main layer

bReserved:=0;

dwLayerMask:=0;

dwVisibleMask:=0;

dwDamageMask:=0;

end;

pixelFormat := ChoosePixelFormat(DC, @pfd);

if (pixelFormat = 0) then

exit;

if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then

exit;

hRc := wglCreateContext(DC);

wglMakeCurrent(DC,HRC);

end;

上面的代码是Windows下初始化OpenGL的固定代码。因为本教程不使用任何第三方库,所以在初始化上显得麻烦些。但这些代码是固定的,每次初始化OpenGL时,照抄代码即可。下面对上述代码作简单的说明。

首先,我们用GetDC(Handle)获取当前窗口的设备目录。然后初始化一个TPIXELFORMATDESCRIPTOR类型的字段,用于描述将要使用的像素格式。在此字段中,dwFlags表示渲染方式,一般情况下使用

PFD_SUPPORT_OPENGL or PFD_DRAW_to_WINDOW or PFD_DOUBLEBUFFER。其中,

PFD_DOUBLEBUFFER表示支持双缓冲。这将会在今后的章节中讲到。cColorBits表示使用的色深,一般情况下使用24位色深。在今后的教程中,会根据不同的需求而改变TPIXELFORMATDESCRIPTOR字段中的值,而其他代码一般都是不变的。

初始化完OpenGL之后,就可以调用OpenGL的绘制函数来绘制图形了。一般情况下,我们把所有绘制图形的函数调用写在一个名为RenderScene的过程中:

procedure TForm1.RenderScene;

begin

...

end;

然后,我们使用一个Timer,其Interval属性设为1,然后在OnTimer事件中调用RenderScene即可。

在窗体关闭时,我们还必须关闭渲染环境以释放内存。方法如下:

procedure TForm1.Form1Close(Sender:TObject;....);

begin

wglMakeCurrent(DC,HRC);

wglDeleteContext(hRc);

ReleaseDC(Handle,DC);

end;

其实,关于OpenGL初始化,我已经写好了一个类。用这个类初始化,可以让窗体的代码简洁一些。首先,下载glInit.pas,并引用它。然后向单元中加入如下代码初始化OpenGL。

...

uses ...,GLInit;

var

glInitor:TOpenGLInit;

implementation

procedure TForm1.Create(....);

begin

glInitor:=TOpenGLInit.Create(Handle,24,stdDoubleBuffer);

end;

procedure TForm1.Close(...);

begin

glInitor.Free;

end;

在本章的示例程序中,我们将初始化OpenGL,并用OpenGL绘制一个三角形。在此程序中,我们还对OpenGL作了其他一些设置,现在你无须理解其中的意义。此程序中,InitOpenGL过程用于初始化OpenGL,FreeOpenGL过程用于销毁OpenGL,SetView过程用于设置视图投影(将在今后的章节中讲到),在RenderScene过程中,我们使用了一个OpenGL的函数绘制了一个三角形。

以下就是本章示例程序的代码。

unit untMainForm;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, OpenGL;

type

TfrmMain = class(TForm)

tmrRender: TTimer;

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure tmrRenderTimer(Sender: TObject);

private

procedure InitOpenGL;

procedure FreeOpenGL;

procedure SetView;

procedure RenderScene;

public

end;

var

frmMain: TfrmMain;

DC: HDC;

HRC :HGLRC ;

implementation

{$R *.dfm}

procedure TfrmMain.FreeOpenGL;

begin

wglMakeCurrent(DC,HRC);

wglDeleteContext(hRc);

ReleaseDC(Handle,DC);

end;

procedure TfrmMain.InitOpenGL;

var pfd:TPIXELFORMATDESCRIPTOR; pixelFormat:integer;

begin

DC := GetDC(Handle);

with pfd do

begin

nSize:=sizeof(TPIXELFORMATDESCRIPTOR); // 此结构尺寸nVersion:=1;

dwFlags:=PFD_SUPPORT_OPENGL or PFD_DRAW_to_WINDOW or

PFD_DOUBLEBUFFER; // 使用双缓冲区

iPixelType:=PFD_TYPE_RGBA; //使用RGBA颜色空间

cColorBits:=24; //24位真彩色cRedBits:=0;

cRedShift:=0;

cGreenBits:=0;

cGreenShift:=0;

cBlueBits:=0;

cBlueShift:=0;

cAlphaBits:=0;

cAlphaShift:=0;

cAccumBits:=0;

cAccumRedBits:=0;

cAccumGreenBits:=0;

cAccumBlueBits:=0;

cAccumAlphaBits:=0;

cDepthBits:=16;

cStencilBits:=0;

cAuxBuffers:=0;

iLayerType:=PFD_MAIN_PLANE;

bReserved:=0;

dwLayerMask:=0;

dwVisibleMask:=0;

dwDamageMask:=0;

end;

pixelFormat := ChoosePixelFormat(DC, @pfd);

if (pixelFormat = 0) then

exit;

if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then

exit;

hRc := wglCreateContext(DC);

wglMakeCurrent(DC,HRC);

end;

procedure TfrmMain.FormCreate(Sender: TObject);

begin

InitOpenGL;

SetView;

end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); begin

FreeOpenGL;

end;

procedure TfrmMain.tmrRenderTimer(Sender: TObject);

begin

RenderScene;

end;

procedure TfrmMain.RenderScene;

begin

glLoadIdentity;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);//清空缓冲区

glColor3ub(0,255,0); //将颜色设置为绿色。

glBegin(GL_TRIANGLES);//告诉OpenGL将要绘制三角形

glVertex2f(200,300); //传输三角形的三个顶点坐标给OpenGL

glVertex2f(400,300);

glVertex2f(300,150);

glEnd; //结束图元的绘制。

SwapBuffers(DC);//交换双缓冲区内容,这将把刚绘制的图形翻印到屏幕上。

end;

procedure TfrmMain.SetView;

begin

glClearColor(0,0,0,0);//设置背景颜色为黑色

glViewPort(0,0,ClientWidth,ClientHeight);//指定OpenGL在此区域内绘图。

glMatrixMode(GL_PROJECTION);//设置视图投影变换矩阵

glLoadIdentity;//加载单位矩阵。

glOrtho(0,ClientWidth,ClientHeight,0,1,-1);//创建平行投影空间。

//在平行投影空间中,远处的物体和近处的物体大小是一致的。

glMatrixMode(GL_MODELVIEW);//将矩阵变换对象切换为模型视图变换。

end;

end.

程序的运行结果:

OpenGL一个简单的例子

先编译运行一个简单的例子,这样我们可以有一个直观的印象。从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序。 例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。

图一:一个彩色的三角形首先创建工程,其步骤如下:

1)创建一个Win32 Console Application。 2)链接OpenGL libraries。在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib 3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE改为__WINDOWS。最后单击OK。 现在你可以把下面的例子拷贝到工程中去,编译运行。你可以看到一个彩色的三角形。 我们先看看main函数。函数中以glut开头的函数都包含在glut.h中。GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。 ·glutInit用来初始化GLUT库并同窗口系统对话协商。 ·glutInitDisplayMode用来确定所创建窗口的显示模式。本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。 ·glutInitWindowSize初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。 ·glutInitWindowPosition设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加。 ·glutCreateWindow创建顶层窗口,窗口的名字为扩号中的参数。 ·background() 这是自己写的函数,设置背景。其实这个函数中的语句可以写在display 函数中,但为了使功能块更加清晰,所以把背景这一部分单独提出来。 ·glutReshapeFunc注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数将被调用。在此例中就是myReshape指定形状变化函数。 ·glutDisplayFunc注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的的显示回调函数。在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。 ·glutMainLoop进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,此例中为glutReshapeFunc,glutDisplayFunc。

计算机图形学 实验 利用OpenGL实现图形的平移、旋转、缩放

XXXXXXXX大学(计算机图形学)实验报告 实验名称利用OpenGL实现图形的平移、旋转、缩放 实验时间年月日 专业姓名学号 预习操作座位号 教师签名总评 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() { glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glV ertex2f( 0.0, -0.2); glV ertex2f( 0.2, 0.0); glV ertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp()

OpenGL编程指南

? ? OpenGL基础图形编程- 总目录 出处:中国游戏开发者 [ 2001-09-20 ] 作者: 总目录 第一章OpenGL与三维图形世界 1.1 OpenGL使人们进入三维图形世界 1.2 OpenGL提供直观的三维图形开发环境 1.3 OpenGL称为目前三维图形开发标准 第二章OpenGL概念建立 2.1 OpenGL基本理解 2.2 OpenGL工作流程 2.3 OpenGL图形操作步骤 第三章Windows NT环境下的OpenGL 3.1 Windows NT下的OpenGL函数 3.2 OpenGL基本功能 3.3 Windows NT下OpenGL结构 第四章OpenGL基本程序结构 第五章OpenGL数据类型和函数名 第六章OpenGL辅助库的基本使用 6.1 辅助库函数分类 6.2 辅助库应用示例 第七章OpenGL建模 7.1 描述图元 7.1.1 齐次坐标

7.1.2 点 7.1.3 线 7.1.4 多边形 7.2 绘制图元 7.2.1 定义顶点 7.2.2 构造几何图元 第八章OpenGL变换 8.1 从三维空间到二维平面 8.1.1 相机模拟 8.1.2 三维图形显示流程 8.1.3 基本变换简单分析 8.2 几何变换 8.2.1 两个矩阵函数解释 8.2.2 平移 8.2.3 旋转 8.2.4 缩放和反射 8.2.5 几何变换举例 8.3 投影变换 8.3.1 正射投影 8.3.2 透视投影 8.4 裁剪变换 8.5 视口变换 8.6 堆栈操作 第九章OpenGL颜色 9.1 计算机颜色 9.1.1 颜色生成原理 9.1.2 RGB色立体 9.2 颜色模式 9.2.1 RGBA模式 9.2.2 颜色表模式 9.2.3 两种模式应用场合 9.3 颜色应用举例 第十章OpenGL光照 10.1 真实感图形基本概念 10.2 光照模型 10.2.1 简单光照模型 10.2.2 OpenGL光组成 10.2.3 创建光源 10.2.4 启动光照 10.3 明暗处理 10.4 材质

使用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入门教程 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.wendangku.net/doc/1513915123.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.wendangku.net/doc/1513915123.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.wendangku.net/doc/1513915123.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

基于OpenGL的3D旋转魔方实现汇总

华中科技大学电子科学与技术系 课程设计报告 ( 2010-- 2011年度第 2 学期) 名称:软件课程设计 题目:基于OpenGL的3D旋转魔方实现 院系: 班级: 学号: 学生姓名: 指导教师: 设计周数: 成绩: 日期:年月日

目录 1.课程设计介绍............................................................................................ (2) 1.1目的.............................................................................................................. (2) 1.2内容.............................................................................................................. (2) 1.3取得的成果 (2) 2.程序分析..................................................................................................... (3) 2.1 程序原理 (3) 2.2 程序流程 (4) 2.3 数据结构 (13) 2.4 重要函数 (13) 3.程序分析与结果演示 (16) 3.1 成果演示 (16) 3.2 程序分析 (17) 4.出现过的问题 (18) 5.心得和小节 (19)

06-OpenGL字体显示

OpenGL 字体显示 在OpenGL中,提供了预定义的字库,可以满足一般的需求,用户也可以自定义字库,OpenGL红宝书中有自定义字库的详细过程。OpenGL预定义字库中提供了位图字符和矢量字符两种显示方式 V oid glutBitmapCharacter(void *font,int character); //位图字符 其中font是GLUT常量,指定点阵字库,如: GLUT_BITMAP_8_BY_13,GLUT_BITMAP_9_BY_15, V oid glutStrokeCharacter(void *font,int character); //矢量字符 Font 的取值有glut_stroke_roman 等间距Roman Simplex 字体,glut_stroke_mono_roman 单一间距Roman Simplex 字体。 本例演示了矢量字符的两种间距以及24磅位图字符的显示。 显示效果: 代码: #include #include #include int width = 200,height = 100; void init(){ glClearColor(0,0,0,0); } void Reshape(int w,int h){ width=w; height=h; glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity();

gluOrtho2D(0.0,width,0.0,height); } void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f,1.0f,0.0f); glLineWidth(2.0); //设置笔画的大小 glTranslatef(0,250,0); //设置字符显示的位置,否则贴底显示不能完全显示部分字符 glutStrokeCharacter(GLUT_STROKE_ROMAN,79); //输出字体为 GLUT_STROKE_ROMAN的OpenGL,从大写O开始,ASSCI码为79 glutStrokeCharacter(GLUT_STROKE_ROMAN,112); glutStrokeCharacter(GLUT_STROKE_ROMAN,101); glutStrokeCharacter(GLUT_STROKE_ROMAN,110); glutStrokeCharacter(GLUT_STROKE_ROMAN,71); glutStrokeCharacter(GLUT_STROKE_ROMAN,76); glTranslatef(-460,-150,0); //调整下一行显示的位置 glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,79); //输出字体为 GLUT_STROKE_MONO_ROMAN的OpenGL,从大写O开始,ASSCI码为79 glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,112); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,101); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,110); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,71); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,76); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'O'); //显示24磅的times Roman 点阵字体 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'p'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'e'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'n'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'G'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'L'); glutSwapBuffers(); } int main(int argc, char* argv[]) { glutInit(&argc,argv); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); glutInitWindowSize( 650, 400 ); glutInitWindowPosition( 100,100 ); glutCreateWindow("show OpenGL"); //′°?ú???a"rectangle" init(); glutDisplayFunc(display); glutReshapeFunc(Reshape);

OpenGL进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。——https://www.wendangku.net/doc/1513915123.html, 一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ]) 本文来源于ZwqXin(https://www.wendangku.net/doc/1513915123.html,/), 转载请注明 原文地址:https://www.wendangku.net/doc/1513915123.html,/archives/opengl/opengl-font-setting-showing.html 怎么表达文字呢?在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。可以到NEHE网站或者在DANCINGWIND的中文翻译(见[搜集的优良OpenG L教程] )看看~。 而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。 三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。其中前两步比较重要,着重讨论讨论哈~ 1. 常规的屏幕字体打印(NormalFont) 应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。NEHE教程中作为首次出现的字体显示方法,介绍应该比较全面,大家想仔细了解的话请务必从上面网址进入学习(当然还有因为我理解不透不敢乱讲的缘由)。 1. /////////一般的英语字体打印 2.void MyFont::BuildGLFont(int fontHeight) 3.{ 4. HDC hDC =::GetDC(HWND_DESKTOP); //////就是这里搞晕了半晚 5. 6. int tFontHeight = -1 * fontHeight; 7. 8. NormalFontBase = glGenLists(96); // Storage For 96 Characters 9. HFONT font = CreateFont( -tFontHeight, // Height Of Font 10. 0, // Width Of Font 11. 0, // Angle Of Escapement 12. 0, // Orientation Angle 13. FW_BOLD, // Font Weight 14. TRUE, // Italic 15. FALSE, // Underline

图形学 用OpenGL实现平移、旋转、缩放

石正坤 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() {

glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glVertex2f( 0.0, -0.2); glVertex2f( 0.2, 0.0); glVertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp() { glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BI T); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green display(); //-------------------------- //平移 glPushMatrix(); glTranslatef(0.5,0.5,0.0); display();

OpenGL期末复习资料

Windows GUI中的基本绘图工具包括: 画笔、画刷、位图、设备描述环境、调色板、字体OpenGL中的基本图元包括:点、线、三角形、四边形、多边形、位图或图像 OpenGL中基本变换函数为: 平移void glTranslated( GLdouble x, GLdouble y, GLdouble z ); 旋转void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); 缩放void glScaled( GLdouble x, GLdouble y, GLdouble z ); OpenGL中设置颜色的函数为: void glColor3f( GLfloat red, GLfloat green, GLfloat blue ); OpenGL中设置法向量的函数为: void glNormal3i( GLint nx, GLint ny, GLint nz ); OpenGL中的透视投影和平行投影对应的函数分别是:glFrustum(); glOrtho(); OpenGL中各个模式(如灯光的启用或禁止)的启用和禁止的函数为:glEnable( GLenum cap )、glDisable (GLenum cap ); Windows对话框的分类:模态对话框,非模态对话框Windows对话框的控件包括:静态控件、按钮控件、滚动条控件、编辑控件、列表框类、组合框类 MFC框架包含的类有: 应用类、文档类、视图类、框架类 设置当前矩阵为单位矩阵的函数为:glLoadIdentity(void); 的功能是重置当前指定的矩阵为单位矩阵如何在OpenGL中绘制基本图元// glLineWidth(1.0f); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_LINES); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(20.0f,0.0f,0.0f); glEnd(); gluLookAt的作用及该函数各个参数的含义 void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz ); eyex, eyey,eyez 指定视点的位置 centerx,centery,centerz 指定参考点的位置 upx,upy,upz 指定视点向上的方向 glLight()中各个参数的含义 void glLighti ( GLenum light, GLenum pname, GLint param ); 启用的灯光号, 光源光的参数 指向那个光源(灯光号)参数被设置 指向启用的灯光的指针 OpenGL中的光照设置方式 1.指明材质glMaterial()漫反射镜面反射 2.设置灯光glLight(Glenum light,Glenum pname,Glint param) 3.生效glEnable(GL_LIGHTING) 4指明打开的灯 glEnable(GL_LIGHT0) OpenGL中的绘制列表的设置方式 // listName = glGenLists (1); glNewList (listName, GL_COMPILE); Opengl函数(一般绘图函数) glEndList (); 显示glCallList(listName); ); Win32编程中镂空图的绘制方法 1、创建一张单色位图,将单色位图选到兼容设备环境 (dcMask),将原图选入令一设备兼容环境(dc)。 2、将dcMask的背景设为紫色,再将dc绘制到dcMask, 得到蒙板图。 3、设置原图所在dc的前景色为白色,背景色为黑色, 将蒙板图和dc中原图做AND运算,绘制到dc中。 hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); hbmp=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BIT MAP,600,450,LR_LOADFROMFILE); SelectObject(mdc,hbmp); BitBlt(mdc,480,190,100,100,bufdc,100,0,SRCAND); //进行与运算 BitBlt(mdc,480,190,100,100,bufdc,0,0,SRCPAINT); //进行OR运算 ReleaseDC(hWnd,hdc); OpenGL中的透视投影和平行投影对应的函数中参数的 含义 void glFrustum ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar ); void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far ); left,right分别指的是左右截面到眼睛(在XY平面上) 的距离 top,bottom分别指的是上下截面到眼睛(在XY平面上) 的距离 zNear, zFar都是相对眼睛的(YZ平面)距离 OpenGL中矩阵堆栈操作的作用 glPushAttrib();glPopAttrib() 矩阵堆栈操作,为重复记录,平移与撤销的操作提供了 一种理想的机制。每次操作只需对当前栈顶矩阵进行操 作即可,glPushAttrib()就相当于记录每一次操作, glPopAttrib()就相当于恢复由glPushAttrib()最新记 录的操作。

OpenGL实现3D模型的交互控制

第24卷第10期 计算机应用与软件 Vol 124No .10 2007年10月 Computer App licati ons and Soft w are Oct .2007 O penG L 实现3D 模型的交互控制 孙妮芳 杨志强 陈 诚 何 斌 龚佩曾 (同济大学计算机系 上海 200092) 收稿日期:2006-12-04。孙妮芳,硕士生,主研领域:虚拟现实技术。 摘 要 简述了3DS 文件的结构,以及在OpenG L 中如何读入和显示3DS 文件的模型,并着重讲述了利用OpenG L 编程接口对场 景中的这些模型进行选择、拾取,通过鼠标拖动对这些模型进行交互操作。关键词 OpenG L 选择 拾取 交互操作 CO NTROL THE 3D MOD EL S I NTERACT I VELY I N O PENGL Sun N ifang Yang Zhiqiang Chen Cheng He B in Gong Peizeng (D epart m ent of Co m puter ,Tongji U niversity,Shanghai 200092,China ) Abstract The structure of 3DS For mat File is outlined,and the way t o read and show the models of 3DS For mat File in OpenG L is p resen 2ted .It is exp lained in detail how the interactive contr ol of the models with the select mode and the feedback mode is realized .Keywords OpenG L Select Picking I nteractive 0 引 言 虚拟实验是当今教育改革比较热门的话题之一,通常意义上讲的虚拟实验建立在真实实验的基础之上,对实验所使用的元器件、,实验者通过鼠标点击与拖曳、键盘操作,可以像对真实元器件一样对虚拟实验设备进行操作,从而完成整个虚拟实验过程。 交互技术是建立虚拟实验要解决的最基本和最重要的问题,交互不仅可以向用户演示信息,同时允许用户向程序传递一些控制信息,比如用户可以通过键盘、鼠标等外设来控制程序的运行。OpenG L 作为一个三维工具软件包,在三维交互编程等方面提供了比较完善的机制。比如,通过OpenG L 的选择、反馈模式比较容易实现通过鼠标键盘进行交互。 目前,已经有不少论文和书籍比较详细地阐述了在OpenG L 中通过选择、拾取和反馈实现对三维物体的交互操作。但对读入和显示多个3DS 文件的模型的交互操作却介绍得比较少。本文根据这一情况并结合实际,在虚拟装机系统中,对场景中的多个元器件模型的交互操作进行详细介绍。 1 3D S 文件介绍 3DS 文件存储了模型的材质信息和几何信息,材质信息主 要包括材质的名称,材质的纹理贴图所对应的文件名以及材质 的颜色等;几何信息主要包括顶点的数目,每个顶点的坐标,三角面的数目,每个三角面上3个顶点的索引,此三角面是否可见等。 3DS 文件由许多块组成,每个块包括信息类别和下一个块的相对位置。块的信息类别用I D 表示,它描述了该块的数据信息。下一个块的相对位置指出了下一个块相对于该块起始位置 的偏移字节数。在块结构中,始终用前2个字节保存I D 号,接下来的4个字节保存块的长度,块的实际内容则用(块长度)6个字节保存。块的内容又可能包含子块。 在OpenG L 中读入3DS 文件的模型的方法有很多,由于本文的程序是在VC ++环境下开发的,所以采用了编写一个类来加载3DS 文件的方法。这样的类很多书籍和网站都有提供,只需进行简单的修改就可以使用,比如修改模型的位置信息以实现模型的移动,增加模型的旋转经度和纬度信息以实现模型的旋转。 2 O penGL 的交互技术 在虚拟装机系统中,要求与场景本身进行更多的交互操作,这种交互除了菜单和对话框实现外,在很多情况下是用鼠标来进行的。OpenG L 的一大功能就是提供了实现交互技术的机制。OpenG L 的交互技术是通过选择、拾取和反馈操作来实现的。 2.1 选 择 选择允许在窗口内部的某个位置用鼠标进行点击,并确定它所点击的是哪个物体。选择是OpenG L 的一种操作模式,选择模式不会改变帧缓存区的内容,退出选择模式时,OpenG L 返回与视景体相交的图元列表,它列出了位于视景体内或与视景体相交的图元,每个图元产生一个选择命中的记录,对应名称堆栈中的当前内容。 ?绘制模式 进入选择模式前,调用函数gl Render M ode (),其原型为:gl Render M ode (G Lenu m mode )。控制应用程序当前所处的模式,即绘图、选择和反馈模式,相应的mode 的取值为G L_RE NDER 、G L _SE LECT 或G L_FEE DBACK 。

基于opengl的三维场景漫游实现

基于opengl的三维场景漫游实现 摘要:本课题是关于opengl三维场景的实现,要求能够实现人机交互,具有缩放、旋转等基本的功能。 利用opengl创建三维模型的原理,本课题在理解opengl创建图形元的基础上,实现了简单三维场景模型的建立。通过建立全局Camera,实现了对场景全方位的观测,同时能够及时响应键盘和鼠标的操作。在此基础上,利用天空盒子和全局地形的方法,实现了三维场景的基本框架,能够在虚拟场景中任意角度的漫游。通过纹理贴图的方法,实现场景的创建,并对场景内部的事物进行碰撞检测,来实现简单的三维场景漫游。 关键词:三维建模; 全局Camera; 场景漫游; 纹理贴图; 碰撞检测

目录 1 课题论述 (1) 1.1选题背景简介 (1) 1.2系统开发平台及运行环境 (1) 1.2.1 开发环境的搭建 (1) 1.2.2 opengl绘图机制 (1) 2课题实现的关键技术 (2) 2.1 场景建模 (2) 2.2 场景渲染 (2) 2.3 纹理映射 (2) 2.4 碰撞检测 (3) 3漫游场景的实现 (4) 3.1 全局Camera的创建 (4) 3.2 地形和天空的绘制 (5) 3.3场景的绘制 (6) 3.4纹理和字体类的设计 (7) 4 总结 (8) 5 程序使用方法介绍 (8)

1 课题论述 1.1选题背景简介 随着科技的发展,人们对视觉的需求也越来越高,这正好也促发了计算机图形学的快速发展:从简单的平面图形到3D空间的立体图形空间的一个转变,为opengl提供了广阔的应用和开发前景。随着opengl的越来越成熟,在各个领域的应用也变得广泛起来。从计算机、多媒体、影视到医学、工业等领域。Opengl开发的重心也有所转变,从普通的三维场景的建立,到现在的大型复杂场景的三维信息生成、实时三维场景光影效果的模拟和实时三维场景的内存使用控制,opengl的发展越来越成熟。 正是基于opengl目前广泛的应用,本课题从opengl基本的图形元的创建、渲染、视角的转换等方面,选择一些opengl的基本操作,实现简单的三维场景空间的漫游,促进对opengl进一步的了解,也为以后进一步的开发做准备。 1.2系统开发平台及运行环境 本设计是基于Opengl 1.0在windows7操作系统下使用Visual C++6.0集成开发环境开发并调试,设计中使用了基于Win Application的架构。 1.2.1 开发环境的搭建 本设计是在Visual C++ 6.0下使用Opengl1.0库开发的,开发环境搭建步骤详细如下:(1)安装Visual C++ 6.0。 (2)配置Opengl1.0 由于Visual C++ 6.0本身带有安装好的opengl1.0版本,所以一些头文件和bin路径的设置就不必要做了。但自带的opengl1.0 没有包含glut函数库,所以需要下载glut函数库,并正确的设置include和bin的路径,并把dll文件放到system32下。 1.2.2 opengl绘图机制 在Windows环境的绘图机制下使用图形设备接口GDI作图要通过设备上下文调用相应的函数,用opengl作图也是这样。Opengl通过“渲染上下文”即RC完成对三维图形的绘制。Windows下的设备上下文和窗口都支持“文图格式”属性,和RC在位图结构方面是一致的。因此只要在创建RC的同时与一个DC建立联系,opengl函数就可以通过对应的DC 绘制到相应的显示设备上面。

OpenGL课程设计-三维球体的实现

游戏软件设计课程报告 (三维球体的实现) 院系: 专业: 学号: 姓名: 指导教师: 2010年10月10日

目录 目录 一、应用程序的最终界面----------------------------------------------------------------1 二、三维球体的绘制---------------------------------------------------------------------2 1、球体绘制方法研究 ----------------------------------------------------------------2 2、面分解法的实现----------------------------------------------------------------3 2.1面分解函数 ----------------------------------------------------------------3 2.2初值的选取 ----------------------------------------------------------------3 2.3 球体的实现----------------------------------------------------------------4 3、三角形绘制函数----------------------------------------------------------------4 4、三角面法向量函数 ----------------------------------------------------------------5 5、点的模长扩展函数 ----------------------------------------------------------------5 6、南北极法的实现----------------------------------------------------------------5 7、动画的实现-------------------------------------------------------------------10 三、二种绘制方法的比较---------------------------------------------------------------12

openGL输出简单文字

#include void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION);//指定设置投影参数 gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数 } void Display(void) { glClear(GL_COLOR_BUFFER_BIT);//用当前背景填充窗口 glColor3f(0.0f,0.0f,1.0f);//设置当前的绘图颜色为红色 glRasterPos3f(50.0,50.0,0.0); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'O'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'p'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'e'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'n'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'G'); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'L'); glFlush();//清空OpenGL命令缓冲区,执行OpenGl程序 } int main(int argc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式 glutInitWindowSize(400,300);//设置窗口的尺寸 glutInitWindowPosition(100,120);//设置窗口的位置 glutCreateWindow("输出OpenGL文字");//创建一个名为输出OpenGL字符的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数 Initial();//完成窗口初始化 glutMainLoop();//启动住GLUT事件处理循环 return 0; }

相关文档
相关文档 最新文档