1

我正在尝试将纹理帧缓冲区复制到 WebGL 中的另一个帧缓冲区,到目前为止它只是给出了一个黑屏。我能够毫无问题地在纹理帧缓冲区中渲染。

这是我认为可以工作的代码(它目前在 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 不支持 glReadBuffer 所以我不能指定它,但是使用 WEBGL_draw_buffers 扩展它支持多个渲染目标,所以我们可以设置附件没有问题(因此渲染到纹理帧缓冲区的工作完美无缺)。

我意识到,由于我无法指定读取缓冲区,也许这种技术行不通?有什么想法或解决方法吗?

4

2 回答 2

1

如果您可以使用 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. 更详细的答案可以在这里找到。

于 2017-05-30T16:00:22.470 回答
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,这意味着您需要正确设置过滤器或需要生成 mip。JavaScript 控制台可能包含有关纹理不可渲染的错误消息

于 2014-10-10T21:05:15.960 回答