无法使程序生成的纹理出现在OpenGL Sphere上

时间:2014-12-19 16:43:23

标签: objective-c macos opengl 3d textures

我想在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_MODULATEGL_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

0 个答案:

没有答案