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

继续前一次所介绍的人物名称显示,再来仔细地深入分析字体渲染,到底怎么样设置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多个汉字才可以显示基本的文章,把所有字体纹理位图保存到内存,就显得比较占用内存,因此使用动态解释的方法或许更好。
第二人生的源码分析(二十二)调用OpenGL显示人物名称的函数_第1张图片
蔡军生 2008/01/18 QQ:9073204 深圳
 
 

你可能感兴趣的:(OpenGL)