您确实可以在 AVCaptureVideoPreviewLayer 之类的东西上分层 OpenGL 内容,但您的性能会受到影响。Apple 强烈建议您不要将不透明的 OpenGL ES 内容覆盖在其他显示元素之上。来自OpenGL ES Programming Guide for iOS:
为了获得绝对的最佳性能,您的应用程序应该完全依赖 OpenGL ES 来呈现您的内容。为此,请调整包含 CAEAGLLayer 对象的视图以匹配屏幕,将其 opaque 属性设置为 YES,并确保没有其他核心动画层或视图可见。如果您的 OpenGL ES 层是在其他层之上合成的,则使您的 CAEAGLLayer 对象不透明会降低但不会消除性能成本。
如果您的 CAEAGLLayer 对象在层层次结构中混合在其下方的层之上,则渲染缓冲区的颜色数据必须采用预乘 alpha 格式,才能由 Core Animation 正确合成。在其他内容之上混合 OpenGL ES 内容会导致严重的性能损失。
老实说,将视频作为纹理拉入,然后将其显示为 3-D 叠加层后面的广告牌并不难。我的示例应用程序将相机视频传递到 OpenGL ES (2.0) 纹理以显示到屏幕上。只需进行一些修改,您就可以在其上放置 3-D 内容。与尝试在 AVCaptureVideoPreviewLayer 之上绘制非透明 3-D 内容相比,这将为您提供更好的性能。
但是,如果您只想在 OpenGL ES 内容上显示简单的静态 UIView,则可以在没有太多性能损失的情况下完成(根据我的经验,帧率降低了约 5%)。