Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2206169
  • 博文数量: 866
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10638
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/landuochong

文章分类

全部博文(866)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(70)

2011年(103)

2010年(360)

2009年(283)

2008年(22)

分类: C/C++

2010-12-06 13:59:47

3、绘制2D英文字符


程序结构:
我们在第二课程序的基础上添加一下功能:

  1. 创建一个全局的2D文本类,在场景中绘制2D英文字符
  2. 按默认方式初始化2D文本类
  3. 使用它在屏幕绘制2D英文字符

为了使用视口类,我们需要包含下面的头文件(text.h),并声明一个全局的视口变量text2D。我们在主程序文件和绘制文件中添加如下的代码:

*************************************新增的代码:包含2D文本类的声明****************************/			
#include "text.h" // 包含2D文字类的声明
/**********************************新增的代码:包含2D文本类的声明:结束**************************/

/*************************************新增的代码:创建Text2D类****************************/
extern Text2D text2D; // 使用全局变量Text2D类实例
/**********************************新增的代码:创建Text2D类:结束**************************/

2、初始化Text2D类

为了使用这个类,我们需要填充TextType数据结构,他用来设置文本的参数,TextType结构的定义如下:
TextType

我们使用如下的默认设置来初始化我们的字体。

/*************************************新增的代码:初始化字体****************************/		
TextType ttype; // 设置字体结构
ttype.name="Courier New"; // 字体名称为"Courier New"
ttype.size=24; // 字体大小为24
ttype.bold=false; // 不使用粗体
ttype.italic=false; // 不使用斜体
ttype.underline=false; // 不使用下划线
text2D.Setup(&WinOpenGL,ttype); // 设置字体
/**********************************新增的代码:初始化字体:结束**************************/
、在屏幕上绘制2D文字

我重载了C++的流输出符号,你可以向使用std::cout一样输出,但只能输出英文字符,整数。这对于图形应用来说应该是够了。

下面是它的绘制代码,我们在Draw.cpp文件中的DrawScene函数中添加这个功能。

	view.Save();			// 保存当前的视口矩阵
view.Reset(); // 重置视口矩阵
view.Translate(0.0f,0.0f,-5.0f); // 把绘制的模型坐标向-Z轴移动5个单位
view.Pos2D(-2.5f,1.0f); // 设置在z=0平面,绘制点的位置
glPushAttrib(GL_DEPTH_BUFFER_BIT); // 保存深度缓存的属性
glDisable(GL_DEPTH_TEST); // 禁用深度测试,可以让我们的文本始终显示在最上层
text2D<<"Draw a pyramid"; // 绘制文本
glPopAttrib(); // 弹出保存的深度缓存属性
view.Restore(); // 弹出保存的视口矩阵

4、绘制带纹理三棱锥


程序结构:
我们在第三课程序的基础上添加一下功能:

  1. 创建一个全局的纹理类
  2. 利用纹理类载入纹理文件
  3. 创建绘制带纹理坐标的三棱锥的函数
  4. 设置当前的纹理并启用它,绘制带纹理坐标的三棱锥

为了使用纹理类,我们需要包含下面的头文件(texture.h),并声明一个全局的视口变量text2D。我们在主程序文件和绘制文件中添加如下的代码:

/*************************************新增的代码:包含纹理类的声明****************************/			
#include "texture.h" // 包含纹理类的声明
/**********************************新增的代码:包含纹理类的声明:结束**************************/

/*************************************新增的代码:创建Texture类****************************/
Texture tex; // 使用全局变量Texture类的实例
int texID; // 使用全局变量texID,保存加载的纹理ID
/**********************************新增的代码:创建Text2D类:结束**************************/

2、利用纹理类载入纹理文件

我们在IniScene函数中完成这个工作,首先调用纹理类的Load函数载入base.bmp图像文件,接着检查是否成功,如果不成功则弹出对话框,提示载入失败。

实现代码如下:

/******************************************************初始化场景***************************************************************************
void IniScene(OpenGL* gl, ControlData* cont)
{
/*************************************新增的代码:载入纹理****************************/
texID = tex.Load("base.bmp");
if(texID==0)
{
MessageBox(NULL,"不能加载base.bmp图像","Error",MB_OK| MB_ICONEXCLAMATION);
cont->quit=true;
return;
}
/**********************************新增的代码:载入纹理:结束**************************/
}
/****************************************************初始化场景:结束************************************************************************/

3、创建绘制带纹理坐标的三棱锥的函数

我们使用标准的OpenGL函数完成这个功能

/*************************************新增的代码:绘制带纹理坐标的三棱锥****************************/	
// 绘制带纹理坐标的三棱锥

void DrawTexTri(void)
{
glPushAttrib(GL_CURRENT_BIT); // 保存当前的绘制属性
glBegin(GL_TRIANGLES);
// 前面
glTexCoord2f(0.5f,0.5f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);

// 右面
glTexCoord2f(0.5f,0.5f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f( 1.0f,-1.0f, -1.0f);

// 后面
glTexCoord2f(0.5f,0.5f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f( 1.0f,-1.0f, -1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(-1.0f,-1.0f, -1.0f);

// 左面
glTexCoord2f(0.5f,0.5f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glEnd();
glPopAttrib(); // 弹出保存的绘制属性
}
/**********************************新增的代码:绘制带纹理坐标的三棱锥:结束**************************/
最后我们启用纹理,并绘制一个带纹理的三棱锥,代码如下:
/*************************************新增的代码:绘制带纹理三棱锥****************************/														
tex.Set(texID);
cont->state->SetTexturing(true);
DrawTexTri();

阅读(556) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册