现在的位置: 首页 > 综合 > 正文

第二人生的源码分析(二十二)调用OpenGL显示人物名称的函数

2013年10月16日 ⁄ 综合 ⁄ 共 2369字 ⁄ 字号 评论关闭
继续前一次所介绍的人物名称显示,再来仔细地深入分析字体渲染,到底怎么样设置OpenGL函数才能显示出来呢?先来看下面一段代码:
#001 void LLFontGL::renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const
#002 {
#003      glTexCoord2f(uv_rect.mRight, uv_rect.mTop);
#004      glVertex2f(llfont_round_x(screen_rect.mRight),
#005                           llfont_round_y(screen_rect.mTop));
#006 
#007      glTexCoord2f(uv_rect.mLeft, uv_rect.mTop);
#008      glVertex2f(llfont_round_x(screen_rect.mLeft),
#009                           llfont_round_y(screen_rect.mTop));
#010 
#011      glTexCoord2f(uv_rect.mLeft, uv_rect.mBottom);
#012      glVertex2f(llfont_round_x(screen_rect.mLeft + slant_amt),
#013                           llfont_round_y(screen_rect.mBottom));
#014 
#015      glTexCoord2f(uv_rect.mRight, uv_rect.mBottom);
#016      glVertex2f(llfont_round_x(screen_rect.mRight + slant_amt),
#017                           llfont_round_y(screen_rect.mBottom));
#018 }
 
上面这段代码就是设置四边形的四个顶点坐标和纹理坐标。
glVertex2f函数是OpenGL里设置顶点坐标的函数,它的定义如下:
void glVertex2f(
GLfloat x,
GLfloat y
);
其实它是用来设置一个表面的顶点,上面就是调用了四次,依次设置了四边形的四个顶点。
同理,glTexCoord2f函数是OpenGL里设置顶点纹理的函数,也调用了四次。
最后会在下面的函数里调用它,代码如下:
#001 void LLFontGL::drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, F32 drop_shadow_strength) const
#002 {
#003       F32 slant_offset;
#004      slant_offset = ((style & ITALIC) ? ( -mAscender * 0.2f) : 0.f);
#005 
#006      glBegin(GL_QUADS);
#007      {
……
#054             else if (style & DROP_SHADOW)
#055             {
#056                    LLColor4 shadow_color = LLFontGL::sShadowColor;
#057                    shadow_color.mV[VALPHA] = color.mV[VALPHA] * drop_shadow_strength;
#058                    glColor4fv(shadow_color.mV);
#059                    LLRectf screen_rect_shadow = screen_rect;
#060                    screen_rect_shadow.translate(1.f, -1.f);
#061                    renderQuad(screen_rect_shadow, uv_rect, slant_offset);
#062                    glColor4fv(color.mV);
#063                    renderQuad(screen_rect, uv_rect, slant_offset);
#064             }
#065             else // normal rendering
#066             {
#067                    glColor4fv(color.mV);
#068                    renderQuad(screen_rect, uv_rect, slant_offset);
#069             }
#070 
#071      }
#072      glEnd();
#073 }
 
drawGlyph函数里实现显示字体,主要通过设置一个四边形的顶点和字体的位图纹理来实现显示。
不过,对于中文的显示,使用第二人生里的实现方法是需要修改的,最主要的差别在于英文只有26个字母就可以显示所有文字了,而中文至少也有2000多个汉字才可以显示基本的文章,把所有字体纹理位图保存到内存,就显得比较占用内存,因此使用动态解释的方法或许更好。
蔡军生 2008/01/18 QQ:9073204 深圳
 

 

抱歉!评论已关闭.