Ios 为OpenGL ES设置CaeAglayer属性?

Ios 为OpenGL ES设置CaeAglayer属性?,ios,opengl-es,Ios,Opengl Es,使用帧缓冲区对象在iOS上进行渲染,根据Apple提供的OpenGL ES iOS编程指南,这似乎是Apple在iOS上进行渲染的首选方式。根据Munshi提供的OpenGL ES 2.0编程指南,应该使用glRenderbufferStorage()指定宽度和高度等属性,金斯伯格和史莱纳。苹果将其替换为renderbufferStorage:fromDrawable:发送到上述指南中EAGLContext的消息 苹果随后继续编写从Renderbuffer获取宽度和高度的代码,因为该缓冲区在创建

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

苹果随后继续编写从Renderbuffer获取宽度和高度的代码,因为该缓冲区在创建时设置了宽度和高度,没有进一步的细节

但宽度和高度为0

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

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

以下是我迄今为止的代码(请注意,苹果使用initWithCoder的一个老例子,我猜到了,或者是从某个我不记得使用initWithFrame的地方得到的):

正确答案:

UIKit将某些操作批处理在一起,并将它们推迟到运行循环的稍后阶段。这是因为您可能有更改视图大小并更改其中不同文本位的代码。你可能想让这种事情原子化

这对你来说可能意味着图层的大小还没有确定。您是否尝试过将所需内容移动到
-(void)layoutSubviews

如果你计划只针对iOS5,你可以直接使用并避免为自己编写这些东西

其他意见:

glRenderbufferStorage
将在OpenGL可以绘制到的不透明位置创建存储,但是操作系统应该如何猜出您希望向用户显示的帧缓冲区,而不仅仅是中间结果?OpenGL规范没有明确定义如何与特定操作系统通信。在iOS中,它是通过
renderbufferStorage:fromDrawable:
实现的,即添加与iOS知道如何组合的
CALayer
相当的存储。苹果的方法并不能取代
glRenderbufferStorage
,它做了
glRenderbufferStorage
不能也不应该做的事情,而且很多时候,即使只为iOS编程,你也会使用它

-(id)initWithFrame:
是手动创建视图时使用的初始化器<代码>-(id)initWithCoder:由系统用于从NIB加载视图

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

正确答案:

UIKit将某些操作批处理在一起,并将它们推迟到运行循环的稍后阶段。这是因为您可能有更改视图大小并更改其中不同文本位的代码。你可能想让这种事情原子化

这对你来说可能意味着图层的大小还没有确定。您是否尝试过将所需内容移动到
-(void)layoutSubviews

如果你计划只针对iOS5,你可以直接使用并避免为自己编写这些东西

其他意见:

glRenderbufferStorage
将在OpenGL可以绘制到的不透明位置创建存储,但是操作系统应该如何猜出您希望向用户显示的帧缓冲区,而不仅仅是中间结果?OpenGL规范没有明确定义如何与特定操作系统通信。在iOS中,它是通过
renderbufferStorage:fromDrawable:
实现的,即添加与iOS知道如何组合的
CALayer
相当的存储。苹果的方法并不能取代
glRenderbufferStorage
,它做了
glRenderbufferStorage
不能也不应该做的事情,而且很多时候,即使只为iOS编程,你也会使用它

-(id)initWithFrame:
是手动创建视图时使用的初始化器<代码>-(id)initWithCoder:由系统用于从NIB加载视图


您的UIView是否明确地将其
层类
指定为
caeaglayer
?否则,对EAGL上下文的调用将被允许失败。

谢谢您的评论!我只是尝试移动到LayoutSubview,但这并没有解决问题。layerClass确实正在返回[Caeaglayer类]。在Xcode中,视图的大小设置为“缩放以适应”。如何调整图层的大小?我来看看我能用GLKView和GLKViewController做些什么。图层应该会自动调整到视图的大小,所以你看到的东西很奇怪。当我有机会的时候,我会挖掘出一些工作的GL代码,看看我是否能找到更有用的东西;很抱歉,我还不能提供“就是这样,这肯定是问题”类型的答案。谢谢你的评论!我只是尝试移动到LayoutSubview,但这并没有解决问题。layerClass确实正在返回[Caeaglayer类]。在Xcode中,视图的大小设置为“缩放以适应”。如何调整图层的大小?我来看看我能用GLKView和GLKViewController做些什么。图层应该会自动调整到视图的大小,所以你看到的东西很奇怪。当我有机会的时候,我会挖掘出一些工作的GL代码,看看我是否能找到更有用的东西;很抱歉,我还不能提供一个“就是这样,这肯定是问题”类型的答案。
- (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;
}