我正在使用OpenGL在Mac OS上进行绘图。当我的代码在Retina显示器上运行时,除了文本绘制外,一切都正常。
在Retina显示器下,文本的大小是应该大小的两倍。这是因为字体大小以点为单位,而在Retina下每个点为2个像素,但OpenGL是基于像素的。
这是标准显示下正确的文本绘制:
这是Retina显示下不正确的文本绘制:
这是我通常绘制字符串的方式。由于OpenGL没有文本绘制函数,为了绘制文本,我执行以下操作:
1.获取字体: NSFontManager fontManager = [NSFontManager sharedFontManager]; NSString font_name = [NSString stringWithCString: "Helvetica" encoding: NSMacOSRomanStringEncoding]; font = [fontManager fontWithFamily: font_name traits:fontStyle weight:5 size:9]; attribs = [[NSMutableDictionary dictionaryWithCapacity: 3] retain]; [attribs setObject:font forKey:NSFontAttributeName];
2.创建和测量字符串: NSString* aString = [NSString stringWithCString: "blah blah" encoding: NSMacOSRomanStringEncoding]; NSSize frameSize = [aString sizeWithAttributes: m_attribs];
3.分配具有尺寸的NSImage: NSImage* image = [[NSImage alloc] initWithSize:frameSize]; [image lockFocus];
4.将字符串绘制到图像中: [aString drawAtPoint:NSMakePoint (0, 0) withAttributes:m_attribs];
5.获取位: NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect (0.0f, 0.0f, frameSize.width, frameSize.height)]; [image unlockFocus];
6.创建OpenGL纹理: GLuint texture = 0; glGenTextures(1, &texture); glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, GLsizei(frameSize.width), GLsizei(frameSize.height), 0, GL_RGBA, [bitmap bitmapData]);
7.绘制纹理: glBindTexture …. 其他OpenGL绘图代码
我的问题是如何使NSString以像素分辨率绘制,而不是点数。 我尝试了以下方法:
这是标准显示下正确的文本绘制:
![Correct text drawing under standard display](https://istack.dev59.com/DaAi2.webp)
![Incorrect text drawing under Retina display](https://istack.dev59.com/IwUEc.webp)
1.获取字体: NSFontManager fontManager = [NSFontManager sharedFontManager]; NSString font_name = [NSString stringWithCString: "Helvetica" encoding: NSMacOSRomanStringEncoding]; font = [fontManager fontWithFamily: font_name traits:fontStyle weight:5 size:9]; attribs = [[NSMutableDictionary dictionaryWithCapacity: 3] retain]; [attribs setObject:font forKey:NSFontAttributeName];
2.创建和测量字符串: NSString* aString = [NSString stringWithCString: "blah blah" encoding: NSMacOSRomanStringEncoding]; NSSize frameSize = [aString sizeWithAttributes: m_attribs];
3.分配具有尺寸的NSImage: NSImage* image = [[NSImage alloc] initWithSize:frameSize]; [image lockFocus];
4.将字符串绘制到图像中: [aString drawAtPoint:NSMakePoint (0, 0) withAttributes:m_attribs];
5.获取位: NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect (0.0f, 0.0f, frameSize.width, frameSize.height)]; [image unlockFocus];
6.创建OpenGL纹理: GLuint texture = 0; glGenTextures(1, &texture); glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, GLsizei(frameSize.width), GLsizei(frameSize.height), 0, GL_RGBA, [bitmap bitmapData]);
7.绘制纹理: glBindTexture …. 其他OpenGL绘图代码
我的问题是如何使NSString以像素分辨率绘制,而不是点数。 我尝试了以下方法:
- 使用一半的字号进行绘制:4.5而不是9。这样可以得到正确的大小,但文本会变得模糊。
- 在OpenGL中以点的大小进行绘制,并将纹理缩小到一半的大小,但这样并不会得到好看的结果: