使用帧缓冲区对象在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的地方得到的):
- (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;
}发布于 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上下文的调用将被允许失败。
https://stackoverflow.com/questions/9047023
复制相似问题