ios - 为 OpenGL ES 设置 CAEAGLLayer 属性?

标签 ios opengl-es

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

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

虽然宽度和高度都是0。

CAEAGLLayer Class Reference 写道“设置层边界以匹配显示的尺寸”。 CAEAGLLayer 类是 Apple 希望用作 View 支持类的类。这是通过从 View 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;
}

最佳答案

正确答案:

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

这对您来说可能意味着层尚未调整大小。您是否尝试过将所有内容移动到 - (void)layoutSubviews

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

其他评论:

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

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

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

关于ios - 为 OpenGL ES 设置 CAEAGLLayer 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047023/

相关文章:

iphone - 如何设置 UITableView 标题 View 的宽度?

ios - EXC_BAD_ACCESS- 返回导航 Controller 时崩溃

iphone - 检查时间和日期是否在特定日期和时间之间

ios - 如何即时操作纹理内容?

ios - 无法在 xcode 中创建临时应用程序

objective-c - 获取从目录加载的 NSString 中的文件名

iphone - 从相机输入复制像素

ios - 与 iOS9 (OGLES2.0) 相比,iOS10/11 下的离屏渲染性能大幅下降

ios - glBlendColor 不适用于 iOS

iphone - iPhone OpenGL教程