glViewport无法在iOS上运行

时间:2016-03-20 14:25:24

标签: ios opengl-es

我试图在iOS上制作一个OpenGL项目,但glViewport无法使用它。

看一下简单的代码示例:

- (void)viewDidLoad
{

    [super viewDidLoad];

    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    [EAGLContext setCurrentContext:context];

    const CGRect frame = [[UIScreen mainScreen] bounds];

    //GLKView *glView = [[GLKView alloc] initWithFrame:CGRectMake(100, 100, 300, 300)];
    GLKView* glView = [[GLKView alloc] initWithFrame:frame context:context];
    [self.view addSubview:glView];

    GLuint renderbuffer;
    glGenRenderbuffers(1, &renderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)glView.layer];

    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);

    // Set the viewport 
    glViewport(100, 100, 300, 300);

    // Clear
    glClearColor(1, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    // Present renderbuffer
    [context presentRenderbuffer:GL_RENDERBUFFER];
}

我在glViewport中所做的任何更改都不会产生任何影响。

但是如果我添加" initWithFrame:CGRectMake(100,100,300,300)"它会工作,但我真的需要glViewport。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

glClear不尊重当前视口。如果要选择要清除的子区域,则需要set the scissor boxglScissor,然后使用glEnable(GL_SCISSOR_TEST)启用剪裁。

答案 1 :(得分:0)

我进行了更多的研究和测试,当使用GLKView创建OpenGL环境时,应该在每一帧上调用glViewport。

要看到glViewport正常工作,需要使用纯EAGLView。

我在这个帖子中找到了答案:glViewport different result in Android and iOS