我使用wglUseFontBitmaps在OpenGL中绘制的字体为每个字母占用相等的空格(宽度),因此为“。”例如,需要与“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);
答案 0 :(得分:5)
我自己解决了这个问题:它看起来只是字体用相等的空格或等宽字体绘制每个字母,但实际上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的2Bytes。使用GL_UNSIGNED_BYTE,用于2字节字符的wstring中的第二个字节的每个'0'被解释为空格。所以正确的电话是:
glCallLists (length, GL_UNSIGNED_SHORT, text.c_str());
这适用于我的情况,但不是将unicode字符与wglUseFontBitmaps一起使用的一般方法。它只能安全地覆盖来自wstring的ASCII字符。