【问题标题】:Displaying an EAGLView with transparent background on a UIImageView在 UIImageView 上显示具有透明背景的 EAGLView
【发布时间】:2011-03-12 16:10:47
【问题描述】:

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



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

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

任何解决方案将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    作为参考,大多数接受的答案都是不必要的。唯一的关键部分是这个(在 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);
    

    【讨论】:

    • 非常感谢您的回答。但是你最后一行中的 GL_DEPTH_BUFFER_BIT 有什么用?
    • 除非你正在做一些特殊效果,你必须每帧清除深度缓冲区(连同你的背景颜色),否则你所有的 3d 位置都会出错,事情会以错误的顺序渲染(或根本没有)
    • 啊,好的。我只有两个维度。感谢您的回答
    • 通常,即使是二维的,您也希望拥有二维内容的“层”。在这种情况下......使用深度缓冲区,您可以节省数千行自定义代码来维护您的分层。当您有硬件等着为您做这件事时,为什么要在软件中做呢? :)
    • 注意:Apple 会从 NIB 中删除此值!?!?!?!?我怎么强调这一点的重要性都不为过。这就像一个半小时的卡住。
    【解决方案2】:

    这是我找到的解决方案:

    在 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);
    

    【讨论】:

    • 解决了一个不同的问题;这导致 EAGLView 是透明的。如果问题是 UIImageView 在 EAGLView 之上,它应该没有任何影响。
    • 其实我并不关心 UIImageView,正如我上面提到的问题。现在我在 EAGLView 下使用 UIView。使 EAGLView 透明只是给了我我想要的东西。现在可以看到底层组件。感谢您抽出宝贵的时间。
    • 您的问题是“我想要在此 UIImageView 上方显示 EAGLView。无论我做什么,它都会在 EAGLView 上方显示 UIImageView。”但我看不出争论有什么意义。很高兴您找到了答案!
    • "如果需要,您可以使用 UIView。任何解决方案都将不胜感激。"我认为它足够灵活。也许下次我应该更清楚。再次感谢。
    【解决方案3】:

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

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

    如果您正在创建它们并以编程方式将它们添加为子视图,则以不同的顺序执行此操作,或从使用 addSubview: 切换到例如insertSubview:belowSubview: 用于 UIImageView。

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

    【讨论】:

    • 在发送此问题之前,我曾尝试使用 insertSubview:belowSubview。它无法解决我的问题。谢谢。
    • 晚了几年,但这对我来说适用于 iOS7,[self.view.superview addSubview:imageview];然后发回。
    【解决方案4】:

    如果你使用 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);
    

    【讨论】:

      【解决方案5】:

      以上答案都不适合我,我使用这个代码修改 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
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        相关资源
        最近更新 更多