在没有使用GLKIT的情况下创建(从头开始)iOS 7.0 OpenGL ES 2.0 App的问题

时间:2014-05-09 08:40:14

标签: ios objective-c opengl-es

这不是OpenGL ES 2 without GLKit

的副本

我已经在iOS上编程OpenGL 4年了,ES2编程差不多2个。但是随着GLKit和Storyboards的加入,以及最新的Xcode,项目模板也不同了。并且不再有OpenGL模板创建EAGLView类。我不想使用GLKit。我更喜欢以编程方式做事。我尽量避免使用笔尖,我以前从未使用过故事板。但是在这种情况下,我将它们从模板中保留下来。

我的步骤:

我从一个新项目开始,然后选择单一视图应用程序。我运行它,它运行良好,白色屏幕。

接下来我去Build Phases并添加QuartzCore,OpenGLES。

然后我做New File并添加一个Objective-C类,使其成为UIView的子类并将其命名为EAGLView。在.h我导入和EAGLContext *上下文

在initWithFrame的.m中我添加了这个初始化代码......

    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = TRUE;


    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
                                    kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat,

                                    nil];

    // Creates the EAGLContext and set it as the current one.
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!_context || ![EAGLContext setCurrentContext:_context])
    {
        NSLog(@"_context no workie!");
        return nil;
    }

在我的ViewController.h中,我添加了@class EAGLView;和一个属性EAGLView *glView;

在viewDidLoad的ViewController.m中,我添加:

CGRect rect = [[UIScreen mainScreen] applicationFrame];
int width=rect.size.width;
int height=rect.size.height;


glView = [[EAGLView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    glView.contentScaleFactor = [[UIScreen mainScreen] scale];
}
glView.contentMode = UIViewContentModeScaleToFill;
self.view = glView;

然后我跑了。我收到此错误消息:

-[CALayer setDrawableProperties:]: unrecognized selector sent to instance 0x8e441c0

我的CAEAGLLayer eaglLayer如何没有.drawableProperties的选择器?我错过了某个地方的一步吗?

*更新*

我找到了这个解决方案:

在EAGLView.m中,我添加了以下内容:

+ (Class) layerClass
{
    return [CAEAGLLayer class];
}

现在它运行没有崩溃。谁能告诉我为什么需要它?

2 个答案:

答案 0 :(得分:2)

您始终需要覆盖此方法。似乎默认图层类是CALayer,它没有setDrawableProperties:方法。您可以看到CAEAGLLayerCALayer的子类。

沿着管道的某个地方叫做

[[[self class] layerClass] performSelector:@selector(setDrawableProperties:) withObject:properties];

在没有覆盖layerClass方法的情况下生成异常。

答案 1 :(得分:0)

OpenGL只能在[CAEAGLayer类]和

上使用
 + (Class) layerClass
{
    return [CAEAGLLayer class];
}

此视图的平均层是CAEAGLayer。