VC中OpenGL汉字显示解决方案

VC中OpenGL汉字显示解决方案
VC中OpenGL汉字显示解决方案

VC中OpenGL汉字显示解决方案

/// Head file

// MiscGL.h: interface for the CMiscGL class.

//

///////////////////////////////////////////////////////////////////// /

#if

!defined(AFX_MISCGL_H__F7358B14_F8AC_11D3_B5AC_0080C87978F2__INCLUDED _)

#define AFX_MISCGL_H__F7358B14_F8AC_11D3_B5AC_0080C87978F2__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

///////////////////////////////////////////////////////////////////// ///

/////

//

// OpenGL Misc function class

//

// Copyright (C) 2000 Risker. All rights are reserved.

//

// Description:

// 1. Chinese character output.

// 2. Texture managment. (略)

//

///////////////////////////////////////////////////////////////////// ///

/////

classCMiscGL

{

// Implementation

public:

CMiscGL();

virtual ~CMiscGL();

static void ShowStringOutline(CStringstrText, HFONT = NULL); staticintShowStringBitmap(LPCTSTR string, HFONT hFont = NULL,

BOOL bUs

eDisplayList = FALSE);

staticintGetTextBitmapBox( SIZE &sizeText, LPCTSTR string,

HFONT hFon

t);

};

#endif //

!defined(AFX_MISCGL_H__F7358B14_F8AC_11D3_B5AC_0080C87978F2__INCLUDED

/////////////////////////////

// CCP Files

// MiscGL.cpp: implementation of the CMiscGL class.

//

///////////////////////////////////////////////////////////////////// /

#include "stdafx.h"

#include "MiscGL.h"

#include "gl/gl.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

CMiscGL::CMiscGL()

{

}

CMiscGL::~CMiscGL()

{

}

voidCMiscGL::ShowStringOutline(CStringstrText, HFONT hFont /* = NULL */)

{

HDC hdc = wglGetCurrentDC();

ASSERT(hdc != NULL);

if (hFont == NULL)

{

hFont = (HFONT)::GetStockObject(SYSTEM_FONT);

}

ASSERT(hFont != NULL);

HFONT hOldFont = (HFONT)::SelectObject(hdc, hFont);

UCHAR * pChar= (UCHAR*)strText.GetBuffer(strText.GetLength()); intnListNum;

DWORD dwChar;

glPushMatrix();

for(int i = 0; i < strText.GetLength(); i++)

{

if(IsDBCSLeadByte((BYTE)pChar[i]))

{

dwChar = (WORD)((pChar[i] << 8) | pChar[i+1]);

i++;

}

else

dwChar = pChar[i];

nListNum = glGenLists(1);

GLYPHMETRICSFLOAT pgmf[1];

wglUseFontOutlines(hdc, dwChar, 1, nListNum, 0.0f, 0.1f,

WGL_FON

T_POLYGONS, pgmf);

glCallList(nListNum);

glDeleteLists(nListNum, 1);

}

glPopMatrix();

strText.ReleaseBuffer();

::SelectObject(hdc,hOldFont);

}

intCMiscGL::ShowStringBitmap(LPCTSTR lpszText,

HFONT hFont /* =

,

BOOL

bUseDisplayList /*=

FALSE */)

{

CBitmap bitmap;

BITMAP bm;

SIZE size;

UCHAR* pBmpBits;

HFONT hOldFont;

HDC hdc = wglGetCurrentDC();

if(!hFont) // use default system font

{

hFont = (HFONT)::GetStockObject(SYSTEM_FONT);

}

hOldFont = (HFONT)SelectObject(hdc, hFont);

::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size); bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);

HDC hMemDC= ::CreateCompatibleDC(hdc);

if(hMemDC)

{

HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC,

bitmap);

HFONT hPrevFont = (HFONT)SelectObject(hMemDC, hFont);

SetBkColor(hMemDC, RGB(0, 0, 0));

SetTextColor(hMemDC, RGB(255, 255, 255));

SetBkMode(hMemDC, OPAQUE);

TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));

// copy GDI bitmap to DIB

bitmap.GetBitmap(&bm);

size.cx = (bm.bmWidth + 31) & (~31);

size.cy = bm.bmHeight;

intbufsize = size.cy * (((bm.bmWidth + 31) & (~31)) /

8);

pBmpBits = new UCHAR[bufsize];

memset(pBmpBits, 0, sizeof(UCHAR)*bufsize);

BITMAPINFOHEADER bih;

RGBQUAD col[2];

}bic;

BITMAPINFO *binf = (BITMAPINFO *)&bic;

binf->bmiHeader.biSize = sizeof(binf->bmiHeader); binf->bmiHeader.biWidth = bm.bmWidth;

binf->bmiHeader.biHeight = bm.bmHeight;

binf->bmiHeader.biPlanes = 1;

binf->bmiHeader.biBitCount = 1;

binf->bmiHeader.biCompression = BI_RGB;

binf->bmiHeader.biSizeImage = bufsize;

binf->bmiHeader.biXPelsPerMeter = 1;

binf->bmiHeader.biYPelsPerMeter = 1;

binf->bmiHeader.biClrUsed = 0;

binf->bmiHeader.biClrImportant = 0;

::GetDIBits(hdc, bitmap, 0, bm.bmHeight, pBmpBits, binf, DIB_RGB

_COLORS);

SelectObject(hMemDC, hPrevBmp);

}

::DeleteDC(hMemDC);

// delete font from DC

SelectObject(hdc, hOldFont);

// display text

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

GLuintdisplist = 0;

if(bUseDisplayList)

{

displist = glGenLists(1);

glNewList(displist, GL_COMPILE);

glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.

0f, 0.0,p

BmpBits);

glEndList();

}

else;

glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,

);

deletepBmpBits;

returndisplist;

}

intCMiscGL::GetTextBitmapBox(SIZE&sizeText, LPCTSTR string, HFONT hFont)

{

ASSERT(hFont != NULL);

SIZE size;

HFONT hOldFont;

HDC hdc = wglGetCurrentDC();

hOldFont = (HFONT)SelectObject(hdc, hFont);

::GetTextExtentPoint32(hdc, string, strlen(string), &size); SelectObject(hdc, hOldFont);

sizeText.cx = (size.cx + 31) & (~31);

sizeText.cy = size.cy;

return 0;

}

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编程指南

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

使用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++

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完全教程 第一章 初始化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进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。——https://www.360docs.net/doc/c318220527.html, 一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ]) 本文来源于ZwqXin(https://www.360docs.net/doc/c318220527.html,/), 转载请注明 原文地址:https://www.360docs.net/doc/c318220527.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编程实现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期末复习资料

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 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的三维场景漫游实现

基于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入门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/c318220527.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/c318220527.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/c318220527.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输出简单文字

#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; }

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/c318220527.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/c318220527.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/c318220527.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹 如果是VC++6,则应该将glut.h复制在“D:\Program Files\MicrosoftVisualStudio\VC98 \Include\GL文件夹”)。

相关文档
最新文档