【问题标题】:Adding UIImageView as subview to an OpenGL ES 2.0 View将 UIImageView 作为子视图添加到 OpenGL ES 2.0 视图
【发布时间】:2012-07-10 17:12:58
【问题描述】:

我已经按照这个 iPhone 设置了一个 OpenGL ES 2.0 视图 - 教程:

http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial

现在我正在尝试在图像上绘画。我已经尝试了以下方法,但没有任何效果:

  • 添加 UIImageView 作为 OpenGL 视图的子视图
  • 在 OpenGL 视图下的 ViewController 中将 UIImageView 添加为子视图
  • 在同一上下文中使用 OpenGL 绘制图像也不起作用,主要是因为纹理大小不是 2 的幂...

这两次都只有 OpenGL 视图可见。

【问题讨论】:

  • 将图像视图置于 OpenGL 视图之上
  • 据我所知,您不能在 openGL 视图内部或下方有 UIKit 元素(无论如何,openGL 视图都不透明),您必须将其绘制在顶部。
  • @KDaker - 不,您确实可以将 UIView 作为显示 OpenGL ES 内容的 UIView 的子视图。我一直都这样做。在这种情况下,肯定有其他问题,因为这应该可以正常工作。
  • 我还尝试将 UIImageView 作为显示 OpenGL ES 内容的 UIView 的子视图。但无法在那个 UIImageView 上绘图。有什么办法解决这个问题?

标签: iphone ios opengl-es


【解决方案1】:

如果你想在 OpenGL 下绘制图像,你不能添加 UIImageView 作为子视图,它会被绘制在你的渲染之上。 将其绘制为矩形上的纹理将起作用(我实际上在应用程序中使用它),但您必须调整图像大小。 将UIImageView 放置在您的 OpenGL 视图下方也可以,但您必须先调整一些参数:

  1. 确保kEAGLDrawablePropertyColorFormatkEAGLColorFormatRGBA8。这必须在您的CAEAGLLayer 中设置,通过设置属性drawableProperties

    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:YES],
                                    kEAGLDrawablePropertyRetainedBacking,
                                    kEAGLColorFormatRGBA8,
                                    kEAGLDrawablePropertyColorFormat,
                                    nil];
    

    我认为合适的地方是你的- (void)setupLayermethod。

  2. 确保您的 CAEAGLLayer.opaque 属性设置为 NO(同样在 setupLayer 中)。
  3. 当你清除缓冲区时,用 0% 的 alpha 颜色清除它,这样 GLView 后面的内容是可见的:

    glClearColor(0.f, 0.f, 0.f, 0.f);
    glClear(GL_COLOR_BUFFER_BIT);
    
  4. 如果您打算使用多重采样或使用 alpha

根据我的经验,无论如何,保持 GLView 不透明并使用纹理绘制背景要快得多。 iPhone 5 用户可能不会注意到,但在旧 iPhone 3G 上,每秒帧数显着增加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2017-01-28
    相关资源
    最近更新 更多