iphone opengl es 2.0 пользовательская сборка gl view не удалась, но не знал почему

#iphone #view #opengl-es-2.0

#iPhone #Вид #opengl-es-2.0

Вопрос:

Я хочу создать представление opengl es 2.0, расширенное из UIView. И передайте эту статью: http://www.raywenderlich.com/3664/opengl-es-2-0- для-iphone-учебное пособие

когда я закончил первый шаг. все работает неправильно. Он не запускался, как я предполагал.

Вот мой код:

 #import <UIKit/UIKit.h>

#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>


@interface NXGLES2View : UIView
- (void) render;
@end
 

 #import "NXGLES2View.h"

@interface NXGLES2View () 
{
    CAEAGLLayer     *eaglLayer_;
    EAGLContext     *glContext_;
    GLuint          colorRenderBuffer_,frameBuffer_, depthRenderBuffer_;

    CADisplayLink   *displayLink_;
}

- (void) setupGL_;
- (void) tearDownGL_;

- (void) setupLayer_;
- (void) setupContext_;

- (void) setupRenderBuffer_;
- (void) setupFrameBuffer_;
- (void) setupDepthBuffer_;

- (void) setupDisplayLink_;
@end



    @implementation NXGLES2View

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            [self setupGL_];
        }
        return self;
    }

    #pragma mark -
    #pragma mark setup step

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

    - (void) setupLayer_{
        eaglLayer_ = (CAEAGLLayer *)self.layer;
        eaglLayer_.opaque = YES;
    }

    - (void) setupContext_{
        glContext_ = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        if (!glContext_) {
            NSLog(@"failed to create eagl context,abort");
            abort();
        }

        if (![EAGLContext setCurrentContext:glContext_]) {
            NSLog(@"failed to set gl context, abort");
            abort();
        }
    }


    - (void) setupRenderBuffer_{
        glGenRenderbuffers(1, amp;colorRenderBuffer_);
        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer_);
        [glContext_ renderbufferStorage:GL_RENDERBUFFER fromDrawable:eaglLayer_];  
    }

    - (void) setupDepthBuffer_{
        glGenRenderbuffers(1, amp;depthRenderBuffer_);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBuffer_);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height);   
    }

    - (void) setupFrameBuffer_{
        glGenFramebuffers(1, amp;frameBuffer_);
        glBindRenderbuffer(GL_FRAMEBUFFER, frameBuffer_);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderBuffer_);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBuffer_);
    }

    - (void) setupDisplayLink_{
        displayLink_ = [CADisplayLink displayLinkWithTarget:self selector:@selector(render)];
        [displayLink_ addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    }

    - (void) setupGL_{
        [self setupLayer_];
        [self setupContext_];
        [self setupDepthBuffer_];
        [self setupRenderBuffer_];
        [self setupFrameBuffer_];
    }

    - (void) tearDownGL_{
        glDeleteRenderbuffers(1, amp;colorRenderBuffer_);
        glDeleteRenderbuffers(1, amp;depthRenderBuffer_);
        glDeleteFramebuffers(1, amp;frameBuffer_);
    }


    #ifndef __IPHONE_5_0
    - (void) dealloc{

        [self tearDownGL_];

        [glContext_ release];
        glContext_ = nil;

        [super dealloc];
    }
    #endif


    #pragma mark - 
    #pragma mark draw

    - (void) render{
        glClearColor(1.0, 0.0, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_DEPTH_TEST);

        [glContext_ presentRenderbuffer:GL_RENDERBUFFER];
    }
 

затем я создаю пустой проект и делаю так:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    NXGLES2View *glview = [[NXGLES2View alloc] initWithFrame:self.window.bounds];
    [self.window addSubview:glview];

    [glview performSelector:@selector(setupDisplayLink_) withObject:nil afterDelay:2.0];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;
}
 

При запуске приложения. он не отображал
glClearColor (1.0, 0.0, 0.0, 1.0);
красный цвет.

и я проверяю статью снова и снова.Я не могу понять, где что-то не так. помогите мне, пожалуйста. еще раз спасибо.

Комментарии:

1. Вы новичок в opengl на iOS, вам гораздо лучше использовать GLKit.developer.apple.com/library/ios/#documentation/GLkit/Reference /…

2. Спасибо. Да, GLKit идеален. Но я хочу знать, где не так. Я хочу углубиться в opengl es на iOS.

3. Я обнаружил, что допустил ошибку в методе setupFrameBuffer_.glBindRenderbuffer(GL_FRAMEBUFFER, frameBuffer_); это должен быть glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer_);

Ответ №1:

Я обнаружил, что допустил ошибку в методе setupFrameBuffer_.

 glBindRenderbuffer(GL_FRAMEBUFFER, frameBuffer_);
 

это должно быть :

 glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer_);