Iphone Xcode 4 OpenGL ES 1.1模板

Iphone Xcode 4 OpenGL ES 1.1模板,iphone,opengl-es,xcode4,Iphone,Opengl Es,Xcode4,我从xcode 4启动了一个新的opengles项目,并删除了所有ES2引用和调用(我想使用ES1绘图代码)。我的示例项目在iPhone4上运行良好,但在iPhone3G和iPod2代上不起作用。Hre是我修改过的代码: 伊格尔维 #import <QuartzCore/QuartzCore.h> #import "EAGLView.h" @interface EAGLView (PrivateMethods) - (void)createFramebuffer; - (void

我从xcode 4启动了一个新的opengles项目,并删除了所有ES2引用和调用(我想使用ES1绘图代码)。我的示例项目在iPhone4上运行良好,但在iPhone3G和iPod2代上不起作用。Hre是我修改过的代码:

伊格尔维

#import <QuartzCore/QuartzCore.h>

#import "EAGLView.h"

@interface EAGLView (PrivateMethods)
- (void)createFramebuffer;
- (void)deleteFramebuffer;
@end

@implementation EAGLView

@synthesize context;

// You must implement this method
+ (Class)layerClass
{
    return [CAEAGLLayer class];
}

//The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:.
- (id)initWithCoder:(NSCoder*)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

        eaglLayer.opaque = TRUE;
        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
                                        kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
                                        nil];
    }

    return self;
}

- (void)dealloc
{
    [self deleteFramebuffer];    
    [context release];

    [super dealloc];
}

- (void)setContext:(EAGLContext *)newContext
{
    if (context != newContext) {
        [self deleteFramebuffer];

        [context release];
        context = [newContext retain];

        [EAGLContext setCurrentContext:nil];
    }
}

- (void)createFramebuffer
{
    if (context && !defaultFramebuffer) {
        [EAGLContext setCurrentContext:context];

        // Create default framebuffer object.
        glGenFramebuffersOES(1, &defaultFramebuffer);
        glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

        // Create color render buffer and allocate backing store.
        glGenRenderbuffersOES(1, &colorRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
        [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &framebufferWidth);
        glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &framebufferHeight);

        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

        if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
    }
}

- (void)deleteFramebuffer
{
    if (context) {
        [EAGLContext setCurrentContext:context];

        if (defaultFramebuffer) {
            glDeleteFramebuffersOES(1, &defaultFramebuffer);
            defaultFramebuffer = 0;
        }

        if (colorRenderbuffer) {
            glDeleteRenderbuffersOES(1, &colorRenderbuffer);
            colorRenderbuffer = 0;
        }
    }
}

- (void)setFramebuffer
{
    if (context) {
        [EAGLContext setCurrentContext:context];

        if (!defaultFramebuffer)
            [self createFramebuffer];

        glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

        glViewport(0, 0, framebufferWidth, framebufferHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(0, framebufferWidth, framebufferHeight, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    }
}

- (BOOL)presentFramebuffer
{
    BOOL success = FALSE;

    if (context) {
        [EAGLContext setCurrentContext:context];

        glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

        success = [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    }

    return success;
}

- (void)layoutSubviews
{
    // The framebuffer will be re-created at the beginning of the next setFramebuffer method call.
    [self deleteFramebuffer];
}

@end
基于此项目计划,本应适用于opengles 1.1设备,但不适用(此代码仅适用于iphone4)!
这里出了什么问题?请帮帮我。谢谢。

一个问题是CADisplayLink在3.1之前的IOS版本中不存在。您可以在awakeFromNib中这样检测:

NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
     mDisplayLinkSupported = TRUE;      
if (mAnimating)
{
    if (mDisplayLinkSupported)
    {
        [mDisplayLink invalidate];
        mDisplayLink = nil;
    }
    else
    {
        [mAnimationTimer invalidate];
        mAnimationTimer = nil;
    }

    mAnimating = FALSE;
}
然后在startAnimation中,你可以这样做

    if (mDisplayLinkSupported)
    {
        // CADisplayLink is API new to iPhone SDK 3.1. Compiling against earlier versions will result in a warning, but can be dismissed
        // if the system version runtime check for CADisplayLink exists in -initWithCoder:. The runtime check ensures this code will
        // not be called in system versions earlier than 3.1.

        mDisplayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:self selector:@selector(drawView:)];
        [mDisplayLink setFrameInterval:1];
        [mDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    }
    else
        mAnimationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(1.0 / 60.0) target:self selector:@selector(drawView:) userInfo:nil repeats:TRUE];
在stopAnimation中,执行以下操作:

NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
     mDisplayLinkSupported = TRUE;      
if (mAnimating)
{
    if (mDisplayLinkSupported)
    {
        [mDisplayLink invalidate];
        mDisplayLink = nil;
    }
    else
    {
        [mAnimationTimer invalidate];
        mAnimationTimer = nil;
    }

    mAnimating = FALSE;
}
您还需要使drawFrame的签名看起来像这样,以便它能够处理AnimationTimer消息

- (void) drawFrame:(id)sender

无论如何,这段代码并没有使用与您相同的变量名,因为我只是从代码中复制了它,但您可以理解其中的要点。顺便说一句,这段代码源自一个旧的XCode模板,该模板考虑了不支持显示链接的旧IOS版本。

问题可能在于视图文件。您必须将其设置为默认的GLES 1,而不是大多数情况下默认的GLES 2。它可能会有类似于

       if ((self = [super initWithCoder:coder]))
   {
       // Get the layer
       CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

       eaglLayer.opaque = TRUE;
       eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

    renderer = [[ES2Renderer alloc] init];

    if (!renderer)
    {
        renderer = [[ES1Renderer alloc] init];

        if (!renderer)
        {
            [self release];
            return nil;
        }
    }

只需更换ES2Renderer和ES1Renderer即可。据说所有这些东西都可以创建eLayer,然后将ES2设置为默认值,如果无法加载ES2,则使用ES1

会出现什么错误?3g和ipod第二代上的背景屏幕颜色为紫色。背景纹理有多大?我认为这个设备的最大尺寸是1024x1024@Bastian谢谢你的回复。我不使用任何纹理作为背景。这是一个有效的观点,但你今天几乎找不到3.0设备。所有旧设备都得到了3.1.3更新,并且从3.0开始支持CADisplayLink。如果问题出在没有粉色屏幕的情况下,应用程序将无法启动。我不认为现在支持3.0是没有意义的。不,CADisplayLink是在3.1版本中首次提供的。你会惊讶有多少人还在运行iOS 3.0。如果你能用一点努力来支持它:去做吧!哦,是的,关于粉色屏幕的观点很好。直到我发完帖子,我才看到那个花边新闻@贾斯蒂德:我想我不会感到惊讶的。从我们市场上的免费游戏来看,约11%的下载来自ios 3.x,89%的下载来自ios 4.x。从这11%的总下载量来看,80%是3.1.3,17%是3.1.2。只有0.22%的下载者仍然拥有3.0。。