📄 tutorial_43.htm
字号:
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">接下来我们选则字体纹理,并生成字体的贴图纹理</td>
<td class="r"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme">// 设置字体纹理的纹理过滤器</span><br> glBindTexture( GL_TEXTURE_2D, tex_base[ch]);<br> glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);<br> glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);</pre>
<p> <span class="theme">// 邦定纹理</span><br>
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,<br>
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, expanded_data );</p>
<p> <span class="theme">// 释放分配的内存</span><br>
delete [] expanded_data;<br>
</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">接着创建一个显示列表,它用来绘制一个字符</td>
<td class="r"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme">// 创建显示列表</span><br> glNewList(list_base+ch,GL_COMPILE);</pre>
<p> glBindTexture(GL_TEXTURE_2D,tex_base[ch]);</p>
<p> <span class="theme">//首先我们向左移动一点</span><br>
glTranslatef(bitmap_glyph->left,0,0);</p>
<p> <span class="theme">//接着我们向下移动一点,这只队'g','y'之类的字符有用<br>
//它使得所有的字符都有一个基线</span><br>
glPushMatrix();<br>
glTranslatef(0,bitmap_glyph->top-bitmap.rows,0);</p>
<p> <span class="theme">// 计算位图中字符图像的宽度</span><br>
float x=(float)bitmap.width / (float)width,<br>
y=(float)bitmap.rows / (float)height;</p>
<p> <span class="theme">//绘制一个正方形,显示字符</span><br>
glBegin(GL_QUADS);<br>
glTexCoord2d(0,0); glVertex2f(0,bitmap.rows);<br>
glTexCoord2d(0,y); glVertex2f(0,0);<br>
glTexCoord2d(x,y); glVertex2f(bitmap.width,0);<br>
glTexCoord2d(x,0); glVertex2f(bitmap.width,bitmap.rows);<br>
glEnd();<br>
glPopMatrix();<br>
glTranslatef(face->glyph->advance.x >> 6 ,0,0);</p>
<p> <span class="theme">//结束显示列表的绘制</span><br>
glEndList();<br>
}<br>
</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面的函数将使用make_dlist创建一个字符集的显示列表,fname为你要使用的FreeType字符文件。</td>
<td class="r"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void font_data::init(const char * fname, unsigned int h) {<br><span class="theme"> // 保存纹理ID.</span><br> textures = new GLuint[128];</pre>
<p> this->h=h;</p>
<p> <span class="theme">// 创建FreeType库</span><br>
FT_Library library;<br>
if (FT_Init_FreeType( &library )) <br>
throw std::runtime_error("FT_Init_FreeType failed");</p>
<p> <span class="theme">// 在FreeType库中保存字体信息的类叫做face</span><br>
FT_Face face;</p>
<p> <span class="theme">// 使用你输入的Freetype字符文件初始化face类</span><br>
if (FT_New_Face( library, fname, 0, &face )) <br>
throw std::runtime_error("FT_New_Face failed (there is probably a problem
with your font file)");</p>
<p> <span class="theme">// 在FreeType中使用1/64作为一个像素的高度所以我们需要缩放h来满足这个要求</span><br>
FT_Set_Char_Size( face, h << 6, h << 6, 96, 96);</p>
<p> <span class="theme">// 创建128个显示列表</span><br>
list_base=glGenLists(128);<br>
glGenTextures( 128, textures );<br>
make_dlist(face,i,list_base,textures);</p>
<p> <span class="theme">// 释放face类</span><br>
FT_Done_Face(face);</p>
<p> <span class="theme">// 释放FreeType库</span><br>
FT_Done_FreeType(library);<br>
}</p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l" height="133"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="back3" height="133" valign="top" width="100%">下面的函数完成释放资源的工作</td>
<td class="r" height="133"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
</tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void font_data::clean() {<br> glDeleteLists(list_base,128);<br> glDeleteTextures(128,textures);<br> delete [] textures;}</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">在print
函数中要用到下面的两个方程,pushScreenCoordinateMatrix函数用来保存当前的矩阵,并设置视口与当前的窗口大小匹配。
pop_projection_matrix函数用来返回pushScreenCoordinateMatrix保存的矩阵。reference
manual. </td>
<td class="r"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme">// 保存当前的矩阵,并设置视口与当前的窗口大小匹配</span><br>inline void pushScreenCoordinateMatrix() {<br> glPushAttrib(GL_TRANSFORM_BIT);<br> GLint viewport[4];<br> glGetIntegerv(GL_VIEWPORT, viewport);<br> glMatrixMode(GL_PROJECTION);<br> glPushMatrix();<br> glLoadIdentity();<br> gluOrtho2D(viewport[0],viewport[2],viewport[1],viewport[3]);<br> glPopAttrib();<br>}</pre>
<p><span class="theme">//返回pushScreenCoordinateMatrix保存的矩阵</span><br>
inline void pop_projection_matrix() {<br>
glPushAttrib(GL_TRANSFORM_BIT);<br>
glMatrixMode(GL_PROJECTION);<br>
glPopMatrix();<br>
glPopAttrib();<br>
</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">我们的print函数和13课的函数非常的像,但在实现上有一些不同。我们实际上是使用2通道的纹理而不是图像。</td>
<td class="r"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_43_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><span class="theme">// 输出文字</span><br>void print(const font_data &ft_font, float x, float y, const char *fmt, ...) {<br> <br><span class="theme"> // 保存当前矩阵</span><br> pushScreenCoordinateMatrix(); <br> <br> GLuint font=ft_font.list_base;<br> float h=ft_font.h/.63f; <br> char text[256]; <br> va_list ap; </pre>
<p> if (fmt == NULL) <br>
*text=0; <br>
else {<br>
va_start(ap, fmt); <br>
vsprintf(text, fmt, ap); <br>
va_end(ap); <br>
}</p>
<p> <span class="theme">// 把输入的字符串按回车分割</span><br>
const char *start_line=text;<br>
vector<string> lines;<br>
for(const char *c=text;*c;c++) {<br>
if(*c=='\n') {<br>
string line;<br>
for(const char *n=start_line;n<c;n++) line.append(1,*n);<br>
lines.push_back(line);<br>
start_line=c+1;<br>
}<br>
}<br>
if(start_line) {<br>
string line;<br>
for(const char *n=start_line;n<c;n++) line.append(1,*n);<br>
lines.push_back(line);<br>
}</p>
<p> glPushAttrib(GL_LIST_BIT | GL_CURRENT_BIT | GL_ENABLE_BIT | GL_TRANSFORM_BIT);
<br>
glMatrixMode(GL_MODELVIEW);<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -