OpenGL ES 2.0 对帧缓冲区创建的无效操作
OpenGL ES 2.0 Invalid operation on framebuffer creation
我正在尝试渲染到纹理,然后将纹理绘制成正方形。创建帧缓冲区时,我在 glFramebufferRenderbuffer
和 glFramebufferTexture2D
调用后得到无效操作。这是应该创建帧缓冲区的函数:
private void createFrameBuffer()
{
final int[] texture = new int[1];
frameTextureID = texture[0];
GLES20.glGenTextures(1,texture,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTextureID);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
final int[] depthBuffer = new int[1];
GLES20.glGenRenderbuffers(1, depthBuffer, 0);
renderBufferID = depthBuffer[0];
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthBuffer[0]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, height);
final int[] frameBuffer = new int[1];
GLES20.glGenFramebuffers(1,frameBuffer,0);
frameBufferID = frameBuffer[0];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,frameBufferID);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, frameTextureID, 0);
error("glFramebufferTexture2D");
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT , GLES20.GL_RENDERBUFFER, renderBufferID);
error("glFramebufferRenderbuffer");
frameBufferComplete("createFrameBuffer");
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
}
我不明白这有什么问题。
ps: 当我在函数末尾检查时,帧缓冲区已完成。
前几条语句的顺序错误:
final int[] texture = new int[1];
frameTextureID = texture[0];
GLES20.glGenTextures(1,texture,0);
您在 glGenTextures()
设置之前获得 texture[0]
的值。所以 frameTextureID
永远是 0。
相反,这应该是:
final int[] texture = new int[1];
GLES20.glGenTextures(1,texture,0);
frameTextureID = texture[0];
另请注意,不保证 RGBA8(具有 8 位分量的 RGBA)是 ES 2.0 中的可渲染格式。这就是您使用 GL_RGBA
和 GL_UNSIGNED_BYTE
组合的纹理。许多实现通过 OES_rgb8_rgba8 extension 支持它。但是,如果您想完全确定您的代码适用于所有设备,则需要使用一种受支持的格式,例如 RGB565:
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_SHORT_5_6_5, null);
我正在尝试渲染到纹理,然后将纹理绘制成正方形。创建帧缓冲区时,我在 glFramebufferRenderbuffer
和 glFramebufferTexture2D
调用后得到无效操作。这是应该创建帧缓冲区的函数:
private void createFrameBuffer()
{
final int[] texture = new int[1];
frameTextureID = texture[0];
GLES20.glGenTextures(1,texture,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTextureID);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
final int[] depthBuffer = new int[1];
GLES20.glGenRenderbuffers(1, depthBuffer, 0);
renderBufferID = depthBuffer[0];
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthBuffer[0]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, height);
final int[] frameBuffer = new int[1];
GLES20.glGenFramebuffers(1,frameBuffer,0);
frameBufferID = frameBuffer[0];
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,frameBufferID);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, frameTextureID, 0);
error("glFramebufferTexture2D");
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT , GLES20.GL_RENDERBUFFER, renderBufferID);
error("glFramebufferRenderbuffer");
frameBufferComplete("createFrameBuffer");
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
}
我不明白这有什么问题。
ps: 当我在函数末尾检查时,帧缓冲区已完成。
前几条语句的顺序错误:
final int[] texture = new int[1];
frameTextureID = texture[0];
GLES20.glGenTextures(1,texture,0);
您在 glGenTextures()
设置之前获得 texture[0]
的值。所以 frameTextureID
永远是 0。
相反,这应该是:
final int[] texture = new int[1];
GLES20.glGenTextures(1,texture,0);
frameTextureID = texture[0];
另请注意,不保证 RGBA8(具有 8 位分量的 RGBA)是 ES 2.0 中的可渲染格式。这就是您使用 GL_RGBA
和 GL_UNSIGNED_BYTE
组合的纹理。许多实现通过 OES_rgb8_rgba8 extension 支持它。但是,如果您想完全确定您的代码适用于所有设备,则需要使用一种受支持的格式,例如 RGB565:
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_SHORT_5_6_5, null);