【问题标题】:setting a CAEAGLLayer properties for OpenGL ES?为 OpenGL ES 设置 CAEAGLLayer 属性?
【发布时间】:2012-01-28 16:55:10
【问题描述】:

根据 Apple 的 OpenGL ES Programming Guide for iOS,使用帧缓冲区对象在 iOS 上进行渲染似乎是 Apple 在 iOS 上的首选渲染方式,应该使用 glRenderbufferStorage() 来指定宽度和高度等属性根据 Munshi、Ginsburg 和 Shreiner 的 OpenGL ES 2.0 编程指南。 Apple 将其替换为 renderbufferStorage:fromDrawable: 在上述指南中发送到 EAGLContext 的消息。

Apple 然后继续写入以从 Renderbuffer 获取宽度和高度,因为该缓冲区在创建时将它们设置为没有进一步的细节。

虽然宽度和高度都是0。

CAEAGLLayer 类参考写入“设置图层边界以匹配显示器的尺寸”。 CAEAGLLayer 类是 Apple 希望用作视图的支持类的类。这是通过从视图 layerClass 方法返回它来完成的。这个 CAEAGLLayer 只有 1 个属性“drawableProperties”,它是一个 NSDictionary。不幸的是,文档很少。无法设置尺寸。

因此:如何继续为 OpenGL ES 设置 CAEAGLLayer 属性?

到目前为止,这是我的代码(请注意 Apple 使用 initWithCoder 的一个旧示例,我要么猜到了,要么从某个我不记得使用 initWithFrame 的地方得到):

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        // Initialization code
        theCAEAGLLayer = (CAEAGLLayer*)self.layer;
        theCAEAGLLayer.opaque = YES;
        theEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        [EAGLContext setCurrentContext:theEAGLContext];
        glGenFramebuffers(1, &theFramebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, theFramebuffer);
        glGenRenderbuffers(1, &theColorRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, theColorRenderbuffer);
        [theEAGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:theCAEAGLLayer];
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, theColorRenderbuffer);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &widthOfTheColorRenderbuffer);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &heightOfTheColorRenderbuffer);
        glGenRenderbuffers(1, &theDepthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, theDepthRenderbuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, widthOfTheColorRenderbuffer, heightOfTheColorRenderbuffer);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, theDepthRenderbuffer);
        if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        {

        }
    }
    return self;
}

【问题讨论】:

    标签: ios opengl-es


    【解决方案1】:

    正确答案:

    UIKit 将某些操作批处理在一起并将它们推迟到运行循环的后期。那是因为您可能拥有更改视图大小并更改其中不同文本位的代码。您可能希望这些事情以原子方式发生。

    这可能对您意味着层尚未调整大小。您是否尝试过将您拥有的东西移至- (void)layoutSubviews

    如果您打算只针对 iOS 5,您可以使用 GLKView 并避免为自己编写任何此类内容。

    其他cmets:

    glRenderbufferStorage 会在 OpenGL 可以绘制到的不透明位置创建存储,但是操作系统应该如何猜测您的哪个帧缓冲区是您想要显示给用户的帧缓冲区,而不仅仅是一个中间结果? OpenGL 规范没有明确定义您如何将其传达给您的特定操作系统。在 iOS 中,它是通过 renderbufferStorage:fromDrawable: 实现的——也就是说添加相当于 iOS 知道如何合成的 CALayer 的存储空间。 Apple 的方法不是 glRenderbufferStorage 的替代品,它做了一些 glRenderbufferStorage 不能也不应该做的事情,而且很多时候你会使用它来代替,即使只为 iOS 编程。

    - (id)initWithFrame: 是您在手动创建视图时使用的初始化程序。系统使用- (id)initWithCoder: 从NIB 加载视图。

    您的 UIView 是否明确将其 layerClass 指定为 CAEAGLLayer?如果不是,那么对您的 EAGL 上下文的调用将被允许失败。

    【讨论】:

    • 感谢您的 cmets!我只是尝试转移到 layoutSubviews,这并没有解决它。 layerClass 确实返回 [CAEAGLLayer 类]。该视图的大小在 Xcode 中设置为“缩放以适应”。如何调整图层大小?我会看看我能用 GLKView 和 GLKViewController 做什么。
    • 图层应该自动调整到视图大小,所以您看到的内容非常奇怪。当我有机会时,我会挖掘一些有效的 GL 代码,看看我是否能找到更有帮助的东西;抱歉,我还不能提供“在这里,这绝对是问题”类型的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多