首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否为OpenGL ES设置CAEAGLLayer属性?

是否为OpenGL ES设置CAEAGLLayer属性?
EN

Stack Overflow用户
提问于 2012-01-29 00:55:11
回答 1查看 3.9K关注 0票数 1

使用帧缓冲区对象在iOS上渲染,这似乎是苹果公司在iOS上渲染的首选方式,根据苹果公司的OpenGL ES iOS编程指南,人们应该使用glRenderbufferStorage()来指定属性,如宽度和高度,根据来自蒙士,金斯伯格和施莱纳的OpenGL ES 2.0编程指南。苹果将其替换为renderbufferStorage:fromDrawable:消息发送到上述指南中的EAGLContext。

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

宽度和高度都是0。

CAEAGLLayer类引用写到“设置层边界以匹配显示器的尺寸”。CAEAGLLayer类是苹果希望人们使用的类,作为他们使用的视图的支持类。这是通过从视图的layerClass方法返回它来完成的。此CAEAGLLayer只有一个属性"drawableProperties“,它是一个NSDictionary。不幸的是,文档是稀疏的。无法设置维度。

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

这是我到目前为止的代码(注意,苹果使用initWithCoder的一个老例子,我要么是猜到的,要么是从我不记得使用initWithFrame的地方得到的):

代码语言:javascript
复制
- (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;
}
EN

回答 1

Stack Overflow用户

发布于 2012-01-29 06:08:35

正确的答案是:

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

对于您来说,这可能意味着该层尚未调整大小。你有没有试过把你拥有的东西移动到- (void)layoutSubviews

如果你打算只针对iOS 5,你可以直接使用GLKView,避免自己写这些东西。

其他评论:

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

如果您手动创建视图,- (id)initWithFrame:是您将使用的初始化器。系统使用- (id)initWithCoder:从NIB加载视图。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9047023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档