繁体   English   中英

为OpenGL ES设置CAEAGLLayer属性?

[英]setting a CAEAGLLayer properties for OpenGL ES?

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

然后,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;
}

正确答案:

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

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

如果您打算仅将iOS 5作为目标,则可以使用GLKView并避免自己编写任何此类内容。

其他的建议:

glRenderbufferStorage将在OpenGL可以绘制到的不透明位置创建存储,但是OS应该如何猜测您要向用户显示的帧缓冲区中的哪一个,而不只是一个中间结果? OpenGL规范没有明确定义如何与特定的操作系统进行通信。 在iOS中,它是通过renderbufferStorage:fromDrawable:来实现的,它表示要添加相当于iOS知道如何组合的CALayer存储。 Apple的方法不能替代glRenderbufferStorage ,它可以做glRenderbufferStorage不能也不应做的事情, glRenderbufferStorage即使只为iOS编程,也有很多次使用它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM