![](/img/trans.png)
[英]Best way to flip a CAEAGLLayer for presentation in OpenGL ES 2
[英]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.