使用帧缓冲区对象在 iOS 上渲染,根据 Apple 的 iOS OpenGL ES 编程指南,这似乎是 Apple 在 iOS 上渲染的首选方式,应该使用 glRenderbufferStorage() 来指定宽度和高度等属性根据 Munshi、Ginsburg 和 Shreiner 的 OpenGL ES 2.0 编程指南。 Apple 将其替换为 renderbufferStorage:fromDrawable: 上面指南中发送到 EAGLContext 的消息。
Apple 然后继续写入以从 Renderbuffer 获取宽度和高度,因为该缓冲区在创建时设置了它们,但没有进一步的细节。
虽然宽度和高度都是0。
CAEAGLLayer Class Reference 写道“设置层边界以匹配显示的尺寸”。 CAEAGLLayer 类是 Apple 希望用作 View 支持类的类。这是通过从 View 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 将某些操作批处理在一起,并将它们推迟到运行循环的后期。那是因为您可能拥有更改 View 大小并更改其中不同文本位的代码。您可能希望这些事情自动发生。
这对您来说可能意味着层尚未调整大小。您是否尝试过将所有内容移动到 - (void)layoutSubviews
?
如果您打算只针对 iOS 5,您可以只使用 GLKView
并避免为自己编写任何此类内容。
其他评论:
glRenderbufferStorage
会在 OpenGL 可以绘制到的不透明位置创建存储,但是操作系统应该如何猜测您的帧缓冲区中的哪个是您想要显示给用户的,而不仅仅是中间结果? OpenGL 规范没有明确定义如何将其与您的特定操作系统进行通信。在 iOS 中,它是通过 renderbufferStorage:fromDrawable:
实现的——也就是说添加相当于 iOS 知道如何合成的 CALayer
的存储。 Apple 的方法不是 glRenderbufferStorage
的替代品,它做了一些 glRenderbufferStorage
不能也不应该做的事情,而且很多时候你会用它代替,即使是在编程时仅适用于 iOS。
- (id)initWithFrame:
是您在手动创建 View 时使用的初始化程序。 - (id)initWithCoder:
被系统用来从 NIB 加载 View 。
您的 UIView 是否明确将其 layerClass
指定为 CAEAGLLayer
?否则,将允许对您的 EAGL 上下文的调用失败。
关于ios - 为 OpenGL ES 设置 CAEAGLLayer 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047023/