在WebGL中,是否有一种方法可以从离屏的渲染缓冲区或帧缓冲区中获取原始像素数据?
我正在使用WebGL进行一些图像处理,例如模糊图像、调整颜色等。我正在使用帧缓冲区以全尺寸渲染到纹理,然后使用该纹理在视口中显示为较小尺寸。我能否获取缓冲区或纹理的像素数据,以便在普通的2D画布上下文中进行操作?或者我只能更改视口至全尺寸,并使用canvas.toDataURL()来获取数据吗?
谢谢。
在WebGL中,是否有一种方法可以从离屏的渲染缓冲区或帧缓冲区中获取原始像素数据?
我正在使用WebGL进行一些图像处理,例如模糊图像、调整颜色等。我正在使用帧缓冲区以全尺寸渲染到纹理,然后使用该纹理在视口中显示为较小尺寸。我能否获取缓冲区或纹理的像素数据,以便在普通的2D画布上下文中进行操作?或者我只能更改视口至全尺寸,并使用canvas.toDataURL()来获取数据吗?
谢谢。
这是一个非常古老的问题,但我最近在three.js中寻找同样的解答。没有直接的方法可以渲染到帧缓冲区,但实际上是通过渲染到纹理(RTT)过程来完成的。我查看了框架源代码,并找到了以下代码:
renderer.render( rttScene, rttCamera, rttTexture, true );
// ...
var width = rttTexture.width;
var height = rttTexture.height;
var pixels = new Uint8Array(4 * width * height); // be careful - allocate memory only once
// ...
var gl = renderer.context;
var framebuffer = rttTexture.__webglFramebuffer;
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
gl.viewport(0, 0, width, height);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
readPixels()
可以实现你想要的功能。在 http://www.khronos.org/registry/webgl/specs/latest/ 的 WebGL 规范中可以了解更多信息。
是的,您可以读取原始像素数据。在获取WebGL上下文时将preserveDrawingBuffer设置为true,然后通过WebGL使用readPixels。
var context = canvasElement.getContext("webgl", {preserveDrawingBuffer: true}
var pixels = new Uint8Array(4 * width * height);
context.readPixels(x, y, width, height, context.RGBA, context.UNSIGNED_BYTE, pixels)
readPixels()
。那是我得到的最接近的答案,所以我接受了它。我应该取消接受那个答案吗? - Sean Kent