【问题标题】:When I use CreateFont() to get the fonts of a string, the arguments are not used当我使用 CreateFont() 获取字符串的字体时,不使用参数
【发布时间】:2014-09-07 17:29:55
【问题描述】:

我想使用 TrueType 字体使用 OpenGL 在屏幕上绘制一些字符串。但是当我尝试渲染它们时出现了问题。

字体大小和位置不正确。并且参数似乎没有被使用。

这是我使用 OpenGL 渲染的窗口:

这些是我的代码:

调用 CreateFont 函数。

hFont = CreateFont(10, 0, 0, 0, FW_LIGHT, 0, 0, 0, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_LH_ANGLES, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Consolas");

glBindTexture(GL_TEXTURE_2D, NULL);
glColor3f(0.1f, 0.45f, 0.75f);

我希望它在 (0, 0) 位置呈现。

glRasterPos2f(0, 0);

一些变量。

int length = lstrlen(text);
if (length < 1)
    return;
HDC hDC = wglGetCurrentDC();
GLYPHMETRICSFLOAT metric[1];
DWORD dwchar;
int list;

绘制每种字体。

SelectObject(hDC, hFont);

for (int i = 0; i < length; i++)
{
    dwchar = text[i];
    list = glGenLists(1);
    wglUseFontOutlines(hDC, dwchar, 1, list, 0.01f, 0.0f, WGL_FONT_POLYGONS, metric);
    glCallList(list);
    glDeleteLists(list, 1);
}

glListBase(list);
DeleteObject(hFont);

接下来我该怎么做?一切似乎都很好。

【问题讨论】:

    标签: c++ opengl fonts


    【解决方案1】:

    wglUseFontOutlines 绘制的轮廓字体不受光栅操作状态 (glRasterPos) 的影响,但会生成大量三角形,这些三角形由常规变换矩阵变换。所以 glTranslate、glScale 等都适用。

    注意:

    • wglUseFontOutlines 为每个字符创建一组显示列表。一直创建和删除显示列表效率低下。根据需要只创建一次,然后保留它们以供绘制。

    • 显示列表已被弃用,并已从 OpenGL-3 核心及更高版本中删除

    【讨论】:

    • 那么接下来该怎么做呢?如何在没有绘图列表的情况下绘制字体?我刚刚找到了一种使用 glScale3d() 来缩放字体的方法。
    • @PENGUINLIONG:文本绘制和OpenGL之间的关系,嗯,很复杂。仍然最直接的方法是结合使用字形光栅化器和布局引擎来绘制像素缓冲区,将其加载到 OpenGL 纹理中并使用一组四边形进行绘制。不幸的是,这是最简单的方法。
    • 好吧。我会试试 wglUseFontBitmaps。非常感谢。
    • @PENGUINLIONG:wglUseFontBitmaps 也好不了多少。它使用 OpenGL 的旧的和已弃用的位图光栅操作。而且它不是便携式的。我建议你使用 freetype-gl,它会按照我的建议将其打包成一个相对易于使用的界面。它也是便携式的。 github.com/rougier/freetype-gl
    • 谢谢。我试试看。
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多