我以为这会是一个很容易找到答案的问题,但结果却非常难以捉摸。基本上,我正在尝试使用WebGL来完成一些图像处理和生成任务的繁重工作,并且希望它可以离屏渲染。理想情况下,我希望WebGL可以将场景渲染到一个framebuffer中,然后我就可以使用gl.readPixels()
从中读取数据,或者将其渲染到webgl画布中,以便我可以将其用作context.drawImage()
的源。问题在于,我不想显示webgl画布本身,我只想将其中的一部分复制到一个可见画布中,我有一个常规的“2d”上下文。到目前为止,我似乎无法在没有以下初始化的情况下使其正常工作,这对我来说看起来像是一个丑陋的hack:
glCanvas = document.createElement('canvas');
glCanvas.width = 256;
glCanvas.height = 256;
document.body.appendChild(glCanvas); // seems necessary, but why?
glCanvas.style.visibility = 'hidden'; // ugh, is this the only way?
目前,我使用gl.createFramebuffer()
创建一个framebuffer,并使用单个gl.drawArrays()
调用呈现场景,然后使用gl.readPixels()
将结果输出到ImageData。在与DOM相关联的glCanvas上,它按计划正常工作。但是,如果我省略上面的最后两行代码,即我附加glCanvas并隐藏它时,当我尝试从我已呈现的framebuffer中读取像素时,我没有得到任何图像。
我不理解为什么即使不渲染到它,glCanvas也需要附加到DOM上。我认为呈现到framebuffer完全发生在显卡上,缓冲区将持续存在以供我用作纹理。WebGL是否只有在至少有一个webgl-context canvas附加到DOM时才会呈现?或者我错过了其他的一些细节吗?谢谢!