我正在使用GLKit的GLKViewController / GLKView来做一些基本的OpenGL绘图。
我想在ViewDidLoad方法中设置ViewPort。在阅读了GLKView参考文献之后,我想我能够这样做:
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!self.context) {
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
glViewport( 0, 0, view.DrawableWidth, view.DrawableHeight );
}
问题是DrawableWidth
和DrawableHeight
属性都为零。这是为什么?当GLKView调用DrawInRect时,它们被设置并且它们的值就是我所期望的。
答案 0 :(得分:3)
此后,只要必须重绘视图,视图就会自动创建或更新帧缓冲对象。
在您收到viewDidLoad
时尚未创建帧缓冲区,因为尚未绘制视图。因此帧缓冲的尺寸也不存在。
此时系统创建帧缓冲区是不合适的。该视图尚未添加到屏幕视图层次结构中。在将其添加到屏幕视图层次结构后,可能会调整其大小,这需要丢弃旧的帧缓冲区并创建一个新的帧缓冲区。
视图会一直等到它实际被要求绘制自己以创建帧缓冲区,因此它不会浪费时间创建一个帧缓冲区,只是为了稍后扔掉它。
答案 1 :(得分:1)
您必须先拨打[view bindDrawable];
然后drawableWidth
和height
将是正确的。这是因为在设置帧缓冲区未绑定后,drawableWidth
/ height
反映了帧缓冲区属性。