【发布时间】:2012-10-01 00:44:02
【问题描述】:
我正在使用 OpenGL 在 Mac OS 中进行绘图。当我的代码在 Retina 显示屏上运行时,除文本绘图外,一切正常。 在视网膜显示下,文本是应有的两倍大。这是因为字体大小以点为单位,每个点在 Retina 下是 2 个像素,但 OpenGL 是基于像素的。
这是标准显示下正确的文字绘制:
这是 Retina 显示下的错误文字绘制:
这就是我通常画弦的方式。由于OpenGL没有文字绘制功能,为了绘制文字我做了以下:
-
获取字体:
NSFontManager fontManager = [NSFontManager sharedFontManager];
NSString font_name = [NSString stringWithCString: "Helvetica" 编码: NSMacOSRomanStringEncoding];
font = [fontManager fontWithFamily: font_name 特征:fontStyle weight:5 size:9];
属性 = [[NSMutableDictionary dictionaryWithCapacity: 3] 保留];
[属性 setObject:font forKey:NSFontAttributeName]; -
创建和测量字符串:
NSString* aString = [NSString stringWithCString: "blah blah" 编码: NSMacOSRomanStringEncoding];
NSSize frameSize = [aString sizeWithAttributes: m_attribs]; -
分配 NSImage 的大小:
NSImage* image = [[NSImage alloc] initWithSize:frameSize];
[图像锁定焦点]; -
将字符串绘制到图像中:
[aString drawAtPoint:NSMakePoint (0, 0) withAttributes:m_attribs];
-
获取位:
NSBitmapImageRep* 位图 = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect (0.0f, 0.0f, frameSize.width, frameSize.height)];
[图像解锁焦点]; -
创建 OpenGL 纹理:
GLuint 纹理 = 0;
glGenTextures(1, &texture);
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, GLsizei(frameSize.width), GLsizei(frameSize.height), 0, GL_RGBA, [位图 bitmapData]); -
绘制纹理:
glBindTexture ....
其他OpenGL绘图代码
我的问题是如何让 NSString 以像素分辨率而不是点数绘制。
我尝试了以下方法:
- 以点大小的一半绘制:4.5 而不是 9。这给了我正确的大小,但文本绘制模糊。
- 在点大小处绘制并将纹理缩小到 OpenGL 中大小的一半,这同样不会产生好看的结果:
【问题讨论】:
标签: macos opengl fonts nsstring retina-display