【发布时间】:2012-01-28 16:55:10
【问题描述】:
根据 Apple 的 OpenGL ES Programming Guide for iOS,使用帧缓冲区对象在 iOS 上进行渲染似乎是 Apple 在 iOS 上的首选渲染方式,应该使用 glRenderbufferStorage() 来指定宽度和高度等属性根据 Munshi、Ginsburg 和 Shreiner 的 OpenGL ES 2.0 编程指南。 Apple 将其替换为 renderbufferStorage:fromDrawable: 在上述指南中发送到 EAGLContext 的消息。
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;
}
【问题讨论】: