⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_43.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<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-&gt;left,0,0);</p>
<p> <span class="theme">//接着我们向下移动一点,这只队'g','y'之类的字符有用<br>
  //它使得所有的字符都有一个基线</span><br>
  glPushMatrix();<br>
  glTranslatef(0,bitmap_glyph-&gt;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-&gt;glyph-&gt;advance.x &gt;&gt; 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-&gt;h=h;</p>
<p> <span class="theme">// 创建FreeType库</span><br>
  FT_Library library;<br>
  if (FT_Init_FreeType( &amp;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, &amp;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 &lt;&lt; 6, h &lt;&lt; 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 &amp;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&lt;string&gt; lines;<br>
  for(const char *c=text;*c;c++) {<br>
  if(*c=='\n') {<br>
  string line;<br>
  for(const char *n=start_line;n&lt;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&lt;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 + -