继续前一次所介绍的人物名称显示,再来仔细地深入分析字体渲染,到底怎么样设置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 深圳