【问题标题】:OpenGL and wglUseFontBitmaps only draws equally spaced lettersOpenGL 和 wglUseFontBitmaps 只绘制等间距的字母
【发布时间】:2013-05-23 16:20:37
【问题描述】:

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

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

我的设置:

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);

【问题讨论】:

  • 这不是一个答案,而是一个建议:不要使用这个。如果要使用 OpenGL 绘制字体,请使用 FreeType。对于这类事情,它是一个更好的库。有一些开源库将 freetype 和 opengl 包装在一起。我相信FTGL是最成熟的。祝你好运。
  • 谢谢。我看过 FTGL,但想不使用它,但我认为现在使用这样的库可能是更好的解决方案。

标签: winapi opengl fonts


【解决方案1】:

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

int length = wcslen(text.c_str());
glCallLists (sizeof(wchar_t) * length, GL_UNSIGNED_BYTE, text.c_str());

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

glCallLists (length, GL_UNSIGNED_SHORT, text.c_str());

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多