OpenGL を使用して Mac OS で描画しています。コードを Retina ディスプレイで実行すると、テキスト描画以外はすべて正常に動作します。Retinal ディスプレイでは、テキストが本来の 2 倍の大きさになります。これは、フォント サイズがポイント単位であり、Retina では各ポイントが 2 ピクセルであるために発生しますが、OpenGL はピクセル ベースです。
標準表示での正しいテキスト描画は次のとおりです。
以下は、Retina ディスプレイでの誤ったテキスト描画です。
これが私が通常どのように文字列を描くかです。OpenGL にはテキスト描画機能がないため、テキストを描画するには次のようにします。
フォントを取得します。
NSFontManager fontManager = [NSFontManager sharedFontManager];
NSString font_name = [NSString stringWithCString: "Helvetica" エンコーディング: NSMacOSRomanStringEncoding];
font = [fontManager fontWithFamily: font_name traits:fontStyle weight:5 size:9];
attribs = [[NSMutableDictionary dictionaryWithCapacity: 3] 保持];
[attribs setObject:font forKey:NSFontAttributeName];文字列を作成して測定します。
NSString* aString = [NSString stringWithCString: "何とか何とか" エンコーディング: NSMacOSRomanStringEncoding];
NSSize frameSize = [aString sizeWithAttributes: m_attribs];次のサイズで NSImage を割り当てます。
NSImage* image = [[NSImage alloc] initWithSize:frameSize];
[画像ロックフォーカス];文字列を画像に描画します。
[aString drawAtPoint:NSMakePoint (0, 0) withAttributes:m_attribs];
ビットを取得します。
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect (0.0f, 0.0f, frameSize.width, frameSize.height)];
[画像ロック解除フォーカス];OpenGL テクスチャを作成します。
Gluint テクスチャ = 0;
glGenTextures(1, &テクスチャー);
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, GLsizei(frameSize.width), GLsizei(frameSize.height), 0, GL_RGBA, [ビットマップ ビットマップデータ]);テクスチャを描く:
glBindTexture ….
その他の OpenGL 描画コード
私の質問は、ポイントではなくピクセル解像度で NSString を描画する方法です。
私は次のことを試しました:
- 9 ではなく 4.5 の半分のポイント サイズで描画します。これにより正しいサイズが得られますが、テキストがぼやけて描画されます。
- ポイント サイズで描画し、テクスチャを OpenGL の半分のサイズに縮小します。これも見栄えの良い結果にはなりません。