为什么iOS上的OpenGL ES渲染垂直翻转?

时间:2019-08-23 06:56:48

标签: android ios c opengl-es

我有一些C代码来渲染OpenGL的东西,它可以在Android和iOS上运行。在Android上看起来不错。但是在iOS上,它是垂直翻转的。

这里有一些简单的代码来演示(由于OpenGL C代码冗长,所以只复制了相关部分):

nin\ja

在Android上,它看起来像这样:

enter image description here

但是在iOS上,它看起来像这样:

enter image description here

两个平台之间唯一的不同是OpenGL ES的初始化代码,因为所有OpenGL代码都是共享的C代码。但是,我看不到初始化代码有什么明显的错误。

这是初始化代码(我删除了大多数错误处理,因为除了剩下的错误之外,没有其他错误被触发):

GLfloat vVertices[] = {
    0.0f,  0.5f,
    -0.5f, -0.5f,
    0.5f, -0.5f
};

glViewport(0, 0, context->width, context->height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(data->programObject);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);

这是创建实际纹理(使用EAGL)的代码:

- (void)initGL {
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];

    [EAGLContext setCurrentContext:_context];
    [self createCVBufferWithSize:_renderSize withRenderTarget:&_target withTextureOut:&_texture];

    glBindTexture(CVOpenGLESTextureGetTarget(_texture), CVOpenGLESTextureGetName(_texture));

    glTexImage2D(GL_TEXTURE_2D,         // target
                 0,                     // level
                 GL_RGBA,               // internalformat
                 _renderSize.width,     // width
                 _renderSize.height,    // height
                 0,                     // border
                 GL_RGBA,               // format
                 GL_UNSIGNED_BYTE,      // type
                 NULL);                 // data
    // HACK: we always get an "error" here (GL_INVALID_OPERATION) despite everything working. See https://stackoverflow.com/questions/57104033/why-is-glteximage2d-returning-gl-invalid-operation-on-ios
    glGetError();

    glGenRenderbuffers(1, &_depthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _renderSize.width, _renderSize.height);
    glGenFramebuffers(1, &_frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(_texture), 0);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthBuffer);

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    } else {
        NSLog(@"Successfully initialized GL");
        char* glRendererName = getGlRendererName();
        char* glVersion = getGlVersion();
        char* glShadingLanguageVersion = getGlShadingLanguageVersion();

        NSLog(@"OpenGL renderer name: %s, version: %s, shading language version: %s", glRendererName, glVersion, glShadingLanguageVersion);
    }
}

谁能告诉我为什么iOS会像这样翻转?从那以后,我注意到其他人也遇到同样的问题,例如here,但还没有找到解决方案。

0 个答案:

没有答案