【问题标题】:glGenFramebuffersOES fails in AndroidglGenFramebuffersOES 在 Android 中失败
【发布时间】:2012-06-09 02:26:24
【问题描述】:

我正在将游戏从 iPhone 移植到 Android。我正在使用 NDK 和 OpenGLES 2.0。
我在使用以下代码创建带有纹理的帧缓冲区时遇到问题,稍后我将使用该纹理对其进行渲染:

glGenFramebuffersOES(1, &glTextureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER, glTextureFrameBuffer);

// attach renderbuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, glName, 0);

GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status == GL_FRAMEBUFFER_COMPLETE) {
    cout << "Framebuffer completed" << endl;
} else {
    cout << "Framebuffer error: " << status << endl;
}

// unbind frame buffer
glBindFramebufferOES(GL_FRAMEBUFFER, 0);

cout << "CREATED FRAMEBUFFER ID: " << glTextureFrameBuffer << endl;

这将打印以下内容:

Framebuffer error: 0
CREATED FRAMEBUFFER ID: 4294967295

渲染到该纹理什么都不做,所以有些事情失败了,glGenFramebuffersOES (4294967295) 返回的 id 让我认为帧缓冲区永远不会生成。

代码在 iOS 上运行良好。
知道可能是什么问题吗?

编辑:

我添加了错误检查:在 glFramebufferTexture2D 之后出现 GL_INVALID_OPERATION。
但在 glGenFramebuffersOES 之后我也出现 GL_INVALID_VALUE 错误。奇怪的是,在 iphone 上我也遇到了这个错误,但一切正常。

我已阅读 OpenGLES 文档,并且如果第一个参数为负数,glGenFramebuffersOES 设置 GL_INVALID_VALUE 错误,但事实并非如此。

编辑 2:

我的错,glGenFramebuffersOES 没有设置任何错误,GL_INVALID_VALUE 之前被设置在某个地方。
但是,glFramebufferTexture2D 仍在设置 GL_INVALID_OPERATION,而且 glGenFramebuffersOES 返回的 id 是 4294967295 在我看来也很奇怪。

有什么想法吗?

【问题讨论】:

  • 添加错误检查。即使代码适用于 iOS。
  • 添加错误检查:在 glFramebufferTexture2D 之后我得到 GL_INVALID_OPERATION

标签: android opengl-es android-ndk


【解决方案1】:

您为什么使用glBindFramebufferOES 而不是glBindFramebuffer? OpenGL ES 2.0 在其核心规范中包含帧缓冲区,而不是在 OES 扩展中(就像 OpenGL ES 1.0 一样)。

您已经在使用glFramebufferTexture2D 函数而不是glFramebufferTexture2DOES,对吧? 所以使用glGenFramebuffers函数和glGenFramebuffers

【讨论】:

    【解决方案2】:

    如果其他人想知道为什么 glGenFramebuffersOES() 不起作用,我认为 Android 的 OpenGL 2.0 不支持它。

    如果您在 Android 中删除显式版本设置 setEGLContextClientVersion(2);,它应该允许您调用 GLES11Ext.glGenFramebuffersOES()。但是,您将失去使用 GLES20 库的所有能力。

    这是基于我的猜测,因为当您使用以下代码调用 checkIfContextSupportsExtension(gl, "GL_OES_framebuffer_object"); 时:

    private boolean checkIfContextSupportsExtension(GL10 gl, String extension) {
        String extensions = " " + gl.glGetString(GL10.GL_EXTENSIONS) + " ";
        return extensions.indexOf(" " + extension + " ") >= 0;
    }
    

    如果客户端版本设置为 2,它将返回 false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2016-05-20
      • 2017-08-14
      • 2017-09-05
      • 1970-01-01
      相关资源
      最近更新 更多