在UIImageView上显示带透明背景的EAGLView

时间:2011-03-12 16:10:48

标签: iphone objective-c opengl-es 3d

我有一个显示OpenGL 3D模型的EAGLView和一个显示图像的UIImageView。


我想要的是在透明背景的UIImageView上方显示EAGLView。

有没有办法在UIImageView上显示带透明背景的3D模型。

任何解决方案都将受到赞赏。

5 个答案:

答案 0 :(得分:11)

作为参考,大多数接受的答案是不必要的。唯一的关键部分是这个(在UIViewController中 - 无需编辑或子类EAGLView / GLKView):

self.view.opaque = NO; // NB: Apple DELETES THIS VALUE FROM NIB
self.view.backgroundColor = [UIColor clearColor]; // Optional: you can do this in NIB instead

您可以在NIB中设置背景颜色 - 但是您无法设置不透明度(Apple似乎在initWithCoder上覆盖GL视图的此var :()

另外,当然,在您的OpenGL代码中,您需要清除alpha = 0.0。因此,无论您的glClear / glClearColor调用已经在哪里,请将clearColor替换为:

glClearColor( 0, 0, 0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

答案 1 :(得分:8)

以下是我找到的解决方案:

在EAGLView.m初始化中

self.opaque = NO;
self.backgroundColor = [UIColor clearColor];

CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = NO;

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
const CGFloat myColor[] = {0.0, 0.0, 0.0, 0.0};
eaglLayer.backgroundColor = CGColorCreate(rgb, myColor);
CGColorSpaceRelease(rgb);

答案 2 :(得分:1)

UIView是EAGLView和UIImageView派生的基类。当您使用EAGLView和UIImageView时,您正在使用UIView。

UIViews有子视图。可能你会有一个UIView,UIImageView和EAGLView都是子视图。通常的规则是子视图按列出的顺序绘制。因此,如果你的UIImageView是在你的EAGLView之上绘制的,那么它就在后面的列表中。

如果您正在创建它们并以编程方式将其添加为子视图,则可以按其他顺序添加,或者从使用addSubview:切换到例如insertSubview:belowSubview:用于UIImageView。

如果您在Interface Builder中进行布局,那么只需确保在UIImageView之后列出EAGLView。

答案 3 :(得分:1)

如果你使用GLKView所有需要做的就是

    view.opaque = NO;
    view.layer.opaque = NO;
    glClearColor(0.f,0.f,0.f,0.f);

还准备显示透明纹理

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

如果需要

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

答案 4 :(得分:0)

上述答案都没有对我有用,我对CCDirector.m使用了这个代码修改,它运行正常:

-(void) setGLDefaultValues
{
    // This method SHOULD be called only after openGLView_ was initialized
    NSAssert( openGLView_, @"openGLView_ must be initialized");

    [self setAlphaBlending: YES];
    [self setDepthTest: YES];
    [self setProjection: projection_];

    // ***** NEW CODE: make open gl view transparent
    openGLView_.opaque = NO;
    glClearColor(0.0, 0.0, 0.0, 0.0);
    // ***** NEW CODE end

    // set other opengl default values
    //glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

#if CC_DIRECTOR_FAST_FPS
    if (!FPSLabel_) {
        CCTexture2DPixelFormat currentFormat = [CCTexture2D defaultAlphaPixelFormat];
        [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444];
        FPSLabel_ = [[CCLabelAtlas labelWithString:@"00.0" charMapFile:@"fps_images.png" itemWidth:16 itemHeight:24 startCharMap:'.'] retain];
        [CCTexture2D setDefaultAlphaPixelFormat:currentFormat];
    }
#endif  // CC_DIRECTOR_FAST_FPS

}