0

我正在尝试通过网站学习opengl。我先看例子,然后自己尝试而不看,这样我就有信心提高我的学习水平。但是,自从 20 天以来,我一直在看 opengl 教程,我知道基础知识非常基础,当我尝试用它做一个非常基础的程序时,我失败了。

我有一个 UIView 子类,我正在尝试用 opengl 绘制一个简单的三角形。但是,似乎我什至无法将背景颜色设置为某种恒定颜色。我的 UIView 子类是这样的;

@implementation GLView{
    GLuint framebuffer;
    GLuint renderbuffer;
    EAGLContext *context;
}

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

-(void)drawView{
     glLoadIdentity();
     glClearColor(0.7, 0.7, 0.7, 1.0);
     glClear(GL_COLOR_BUFFER_BIT);

}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
        CAEAGLLayer *layer = (CAEAGLLayer*)self.layer;
        layer.opaque = YES;
        [EAGLContext setCurrentContext:context];
        if(!context){
            NSLog(@"Could not create context");
        }
        glGenFramebuffers(1, &framebuffer);
        glGenRenderbuffers(1, &renderbuffer);
        glBindFramebuffer(GL_FRAMEBUFFER_OES, framebuffer);
        glBindRenderbuffer(GL_RENDERBUFFER_OES, renderbuffer);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, renderbuffer);
        [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)layer];
        glViewport(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
        [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id<EAGLDrawable>)self.layer];
        [context presentRenderbuffer:GL_RENDERBUFFER_OES];
        [self drawView];

    }
    return self;
}

如果我理解正确,上面的代码应该将我的视图背景设置为灰色。但是,我确信我错过了一些非常简单的概念。如果有人能指出,那就太好了。谢谢

4

2 回答 2

0

在 glClear() 之后,您缺少 glFlush()。

于 2013-01-07T21:05:42.650 回答
0

您没有正确使用 Cocoa Touch 框架。drawView在将视图插入视图层次结构之前,您的调用只发生一次。也许如果您将drawView方法中的代码移动到drawInRect:方法中,这可能会起作用。更好的解决方案是放弃这行编程,而使用 GLKit。

GLKit 提供 GLKView 和 GLKViewController 类来设置和管理 OpenGL ES 将内容绘制到 iOS 设备屏幕所需的大部分内容。只需继承 GLKViewController 并实现一些委托方法,它就非常容易使用。

Jason L. McKesson 的在线书籍Learning Modern 3D Graphics Programming是学习 OpenGL 的可编程管道版本(例如 iOS 上的 OpenGL ES 2.0)的良好开端。我正在阅读这本书,将 McKesson 的示例移植到 iOS,并分享我学到的东西。因为我在 GLKit 上构建了我的端口,所以它们是一堆关于如何使用 GLKit 的示例。

于 2013-01-09T14:17:39.013 回答