【问题标题】:"Regular" drawing on top of OpenGL layerOpenGL 层顶部的“常规”绘图
【发布时间】:2012-01-11 00:56:20
【问题描述】:

如何在后台运行的 OpenGL 动画之上实现“常规”绘图(通常在 drawRect 方法中完成)?我的应用是 OpenGL 应用,它是默认的 Xcode 游戏应用模板。 GLKViewController 没有 drawRect 方法,当我添加一个时,它永远不会被调用。我尝试在 drawInRect 方法(确实存在)中实现绘图代码,但出现运行时错误。

总结一下:我想不使用 OpenGL 绘制东西(线、路径等),而是使用常规的石英图元,并将其显示在现有的 3D 渲染之上。

【问题讨论】:

    标签: ios opengl-es


    【解决方案1】:

    要确保drawRect 被调用,您可能应该走另一条路:创建一个标准的Cocoa Touch 项目,将主视图的+ (Class)layerClass 方法更改为返回[CAEAGLLayer class],然后开始绘制。请注意,CAEAGLLayer documentation 特别警告不要做你想做的事:

    避免在 CAEAGLLayer 对象之上绘制其他图层。如果您必须绘制其他非 OpenGL 内容,您可能会发现如果将透明 2D 内容放在 GL 内容之上并确保 OpenGL 内容不透明且未转换,则性能成本是可以接受的。

    查看GLPaint 项目以获取显示layerClass 覆盖的简单OpenGL ES 项目(在PaintingView.m 中)。他们使用layoutSubviewstouchesBegan/Moved/Ended 进行绘图。

    【讨论】:

    • 谢谢。我看到使用 [context presentRenderbuffer:GL_RENDERBUFFER_OES] 调用在 renderLineFromPoint 中进行了实际绘图。但是我如何将常规的石英绘图命令合并到这个 GL 层之上的层中呢?我假设我不能使用与 GL 层相同的“上下文”?
    • 在 Interface Builder 或代码中,将额外的 UIViews 定义为主视图的子视图。每个UIView 都有一个内部CALayer,所以当它被要求绘制自己时,它将使用该层的上下文。此时的 GL 上下文无关紧要。
    • This SO question 可能会有所帮助。
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多