0

我正在将游戏从 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 在我看来也很奇怪。

任何的想法?

4

2 回答 2

2

你为什么使用glBindFramebufferOES而不是glBindFramebuffer?OpenGL ES 2.0 在其核心规范中有帧缓冲区,而不是在 OES 扩展中(如 OpenGL ES 1.0 有)。

您已经在使用glFramebufferTexture2D函数 not glFramebufferTexture2DOES,对吗?所以使用glGenFramebuffers函数和也glGenFramebuffers

于 2012-06-09T17:14:03.833 回答
1

如果其他人想知道为什么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

于 2016-10-06T02:44:56.900 回答