第二人生的源码分析(二十二)调用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多个汉字才可以显示基本的文章,把所有字体纹理位图保存到内存,就显得比较占用内存,因此使用动态解释的方法或许更好。
蔡军生 2008/01/18 QQ:9073204 深圳