3

我正在使用 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 );
}

问题是DrawableWidthDrawableHeight属性都为零。这是为什么?当 GLKView 调用 DrawInRect 时,它们被设置并且它们的值是我所期望的。

4

2 回答 2

3

GLKView类参考是这样说的:

此后,每当必须重绘视图时,视图都会自动创建或更新帧缓冲区对象。

在您收到 时尚未创建帧缓冲区viewDidLoad,因为还不需要绘制视图。所以帧缓冲区的尺寸也不存在。

此时系统创建帧缓冲区是不合适的。该视图尚未添加到屏幕视图层次结构中。将其添加到屏幕视图层次结构后,可能会调整其大小,这需要丢弃旧的帧缓冲区并创建一个新的帧缓冲区。

视图一直等到它实际被要求绘制自己以创建帧缓冲区,这样它就不会浪费时间创建一个帧缓冲区,只是为了稍后扔掉。

于 2012-03-04T18:53:55.493 回答
1

你必须先打电话[view bindDrawable];

然后drawableWidthheight将是正确的。这是因为在设置帧缓冲区后未绑定和drawableWidth/height反映帧缓冲区属性。

于 2015-09-27T10:11:27.130 回答