我想在MacBook应用程序中标记带有文本标签的3D OpenGL对象(球体)。我决定使用文本创建一个位图,并使用它创建一个将绑定到球体的OpenGL纹理。 Mac正在远离GLUT,因此我的代码不含GLUT。基础知识都可以工作,但是我无法获取文本来包装球体:就好像没有纹理映射代码那样。这是窗口控制器的代码,我用它来创建纹理:
- (GLuint) makeDecalFor: (PasteurCard*) aRole
withCardColor: (PasteurColor*) cardColor
{
assert(aRole != nil);
assert(cardColor != nil);
NSString *const roleName = [aRole name];
assert(context_ != nil);
[context_ makeCurrentContext]; // context_ is an NSOpenGLContext*
GLuint textureID[2];
textureID[0] = textureID[1] = 0;
NSColor *const textColor = [NSColor blackColor];
NSFont *const font = [NSFont systemFontOfSize: 26];
NSRect frame;
frame.origin.x = 0.0f;
frame.origin.y = 0.0f;
frame.size.height = 128;
frame.size.width = 128;
NSPoint textLocation;
textLocation.x = 40;
textLocation.y = 48;
NSBitmapImageRep *bitmap = nil;
NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys:
textColor, NSForegroundColorAttributeName,
[NSNumber numberWithFloat: -3.0], NSStrokeWidthAttributeName,
font, NSFontAttributeName,
nil];
NSImage *image = [[NSImage alloc] initWithSize: frame.size];
assert(image != nil);
[image lockFocus];
[[cardColor cocoaColor] set];
[NSBezierPath fillRect: frame];
assert(textColor != nil);
[textColor set];
[roleName drawAtPoint: textLocation withAttributes: attribs];
bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect: frame];
assert(bitmap != nil);
// at this point the bitmap looks fine
[image unlockFocus];
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); // or GL_DECAL
glGenTextures(1, &textureID[0]);
glBindTexture( GL_TEXTURE_2D, textureID[0] );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
const BOOL bitmapHasAlpha = [bitmap hasAlpha]; // yes, it does
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RGBA,
bitmap.size.width,
bitmap.size.height,
0,
bitmapHasAlpha ? GL_RGBA : GL_RGB,
GL_UNSIGNED_BYTE,
[bitmap bitmapData]
);
assert(textureID[0] > 0);
return textureID[0];
}
我虔诚地检查了OpenGL返回码(为简洁起见,我从上面的代码中省略了这些检查)。 glGenTextures
调用返回一个合理的值(第一个为1,后续对象为连续的小整数。)
GL_LIGHTING
已启用,我知道当我进入下一步时,我最终必须使用GL_MODULATE
和GL_DECAL
。我担心启用GL_COLOR_MATERIAL
是有问题的,但是它适用于O.K.与存根。
如果我用读取简单RGB图像(也有alpha通道,FWIW)的存根替换此代码并生成纹理,它可以工作:我得到一个很好地包裹在球体上的罐装纹理。这表明我的错误在上面的代码中。我在这里剔除了相关的帖子,并仔细听取了似乎适用于我的案例的建议,但无济于事。我做错了什么?
OSX Yosemite 10.10.1,MacBook Pro,Xcode 6.1.1,OpenGL 2.1 INTEL-10.0.86