第二人生的源码分析(二十二)调用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 深圳
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值