首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL和wglUseFontBitmaps仅绘制等间距的字母

OpenGL和wglUseFontBitmaps仅绘制等间距的字母
EN

Stack Overflow用户
提问于 2013-05-17 16:23:07
回答 1查看 2K关注 0票数 5

我使用wglUseFontBitmaps在OpenGL中绘制的字体在每个字母上占用相等的空间(宽度),所以“。例如,需要和"M“一样多的空间。我已经将字体创建中的音调参数更改为VARIABLE_PITCH,但这并没有改变任何东西。这实际上可以用wglUseFontBitmaps来完成吗?或者它的本质是每个生成的位图占用相等的空间?

此外,我还使用GetTextExtentPoint32W()查询栅格位图文本的宽/高。返回的宽度还可以,但高度总是太大。我在黑色文本后面画了一个明亮的矩形,使其在3d场景中始终可读。为什么查询的高度这么大?预留给高位字符的空间是这样的吗?

我的设置:

代码语言:javascript
运行
复制
HFONT   font;                                       // Windows Font ID
font = CreateFont(  -12,                            // Height Of Font
        0,                              // Width Of Font
        0,                              // Angle Of Escapement
        0,                              // Orientation Angle
        FW_EXTRALIGHT,                      // Font Weight
        FALSE,                          // Italic
        FALSE,                          // Underline
        FALSE,                          // Strikeout
        ANSI_CHARSET,                   // Character Set Identifier
        OUT_TT_PRECIS,                  // Output Precision
        CLIP_DEFAULT_PRECIS,            // Clipping Precision
        ANTIALIASED_QUALITY,            // Output Quality
        FF_DONTCARE | VARIABLE_PITCH,       // Family And Pitch
        (LPCWSTR)L"Arial");             // Font Name

    SelectObject(this->hDeviceContext, font);

     //init display lists for text drawing
    bool createFontLists = wglUseFontBitmaps(this->hDeviceContext, 0, 255, 1000);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-23 16:20:38

我自己解决了这个问题:字体看起来像是用等间距或等间距绘制每个字母,但实际上OpenGL在每个字符之间绘制了一个空格“”。问题出在调用wglUseFontBitmaps生成的显示列表时使用了std::wstring。错误的绘图如下所示:

代码语言:javascript
运行
复制
int length = wcslen(text.c_str());
glCallLists (sizeof(wchar_t) * length, GL_UNSIGNED_BYTE, text.c_str());

第一个参数(要调用的列表数量)错误。它只能是length。第二个参数告诉OpenGL如何将text.c_str中的每个字符解释为定义下一个要调用的显示列表的偏移量,这在这里是错误的。它必须是从0到65535的2Bytes的GL_UNSIGNED_SHORT。对于GL_UNSIGNED_BYTE,2字节字符的wstring中的第二个字节使用的每个'0‘都被解释为一个空格。所以正确的调用是:

代码语言:javascript
运行
复制
glCallLists (length, GL_UNSIGNED_SHORT, text.c_str());

这适用于我的情况,但不是在wglUseFontBitmaps中使用unicode字符的一般方法。在这里,它只安全地涵盖来自wstring的ASCII字符。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16604574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档