分类:
2012-03-23 11:32:08
原文地址:创建基于Nehe SDK的应用程序(3) 作者:landuochong
程序结构:
我们在第二课程序的基础上添加一下功能:
为了使用视口类,我们需要包含下面的头文件(text.h),并声明一个全局的视口变量text2D。我们在主程序文件和绘制文件中添加如下的代码:
*************************************新增的代码:包含2D文本类的声明****************************/
#include "text.h" // 包含2D文字类的声明
/**********************************新增的代码:包含2D文本类的声明:结束**************************/
/*************************************新增的代码:创建Text2D类****************************/
extern Text2D text2D; // 使用全局变量Text2D类实例
/**********************************新增的代码:创建Text2D类:结束**************************/
2、初始化Text2D类
为了使用这个类,我们需要填充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(); // 弹出保存的视口矩阵
|
/*************************************新增的代码:包含纹理类的声明****************************/
#include "texture.h" // 包含纹理类的声明
/**********************************新增的代码:包含纹理类的声明:结束**************************/
/*************************************新增的代码:创建Texture类****************************/
Texture tex; // 使用全局变量Texture类的实例
int texID; // 使用全局变量texID,保存加载的纹理ID
/**********************************新增的代码:创建Text2D类:结束**************************/
|
/******************************************************初始化场景***************************************************************************
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;
}
/**********************************新增的代码:载入纹理:结束**************************/
}
/****************************************************初始化场景:结束************************************************************************/
|
/*************************************新增的代码:绘制带纹理坐标的三棱锥****************************/
// 绘制带纹理坐标的三棱锥
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();