2014-10-10 118 views
0

我想在WebGL中将纹理framebuffer复制到另一个,到目前为止它只是给出了黑屏。我能够毫无问题地在纹理framebuffer中渲染。WebGL复制纹理framebuffer纹理framebuffer?

这是我认为会的工作代码(它目前适用于iOS):

// bind source fbo while we remember current fbo 
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &current_fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, src_framebuffer); 

// setup source fbo attachments 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, src_handle, 0); 
//glReadBuffer(GL_COLOR_ATTACHMENT0); <- commented out because it is not available in WebGL 

// bind destination fbo 
glActiveTexture(GL_TEXTURE0 + i); 
glBindTexture(dest_target, dest_handle); 

// copy from source to dest 
glCopyTexImage2D(dest_target, 0, dest_format, 0, 0, dest_width, dest_height, 0); 

// set back original fbo 
//glReadBuffer(GL_NONE); 
glBindFramebuffer(GL_FRAMEBUFFER, current_fbo); 

的WebGL不与WEBGL_draw_buffers扩展支持glReadBuffer所以我不能指定,但它支持多渲染目标,所以我们可以设置附件没有问题(因此渲染纹理framebuffer工作完美无缺)。

我意识到,因为我不能指定读取缓冲区,也许这种技术无法正常工作?任何想法或解决方法?

+0

我很困惑。上面的代码是OpenGL而不是WebGL – gman 2014-10-10 20:50:18

+0

@gman是的,这是因为我正在通过Emscripten编译我的代码,所以它最终仍然是WebGL。 – Deathicon 2014-10-13 03:57:03

回答

0

如果你可以使用WebGL的2.0,你可以简单地做:

gl.bindFramebuffer(GL_READ_FRAMEBUFFER, src); 
gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, dst); 
gl.blitFramebuffer(src_left, src_bottom, src_right, src_top, 0, 0, dst_width, dst_height, mask, GL_NEAREST); 

否则,我想这是正确使用gl.copyTexImage2D。更详细的答案可以在here找到。

0

CopyTexImage2D工作得很好。这里有2个一致性测试

https://www.khronos.org/registry/webgl/sdk/tests/conformance/textures/copy-tex-image-2d-formats.html?webglVersion=1

https://www.khronos.org/registry/webgl/sdk/tests/conformance/textures/copy-tex-image-and-sub-image-2d.html?webglVersion=1

你有没有进行错误检查JavaScript控制台?您只复制0级,这意味着您需要正确设置您的过滤条件,或者您需要生成mips。 JavaScript控制台可能会包含有关纹理是错误消息unrenderable

+0

STUPID SO不会让我发布无代码的jsfiddle链接,但代码与这一点无关,所以这里是一个链接http://jsfiddle.net/greggman/rs21sr46/ – gman 2014-10-10 21:05:53

+0

我不确定此链接是否提供了一个示例我正在努力实现的。让我试着再次解释一下:我试图从可渲染纹理framebuffer中读取数据,并将其复制到另一个可渲染纹理帧缓冲区中。通常我提供的代码在iOS上工作得很好。但由于我们无法在WebGL中指定读取缓冲区,所以替代路线是什么? – Deathicon 2014-10-13 04:06:50

+0

如何从源纹理/帧缓冲区采样渲染到目标帧缓冲区。无论如何,glCopyTexImage2D很可能在驱动代码中实现。 – 2016-10-23 15:17:07