2014-12-03 41 views
0

我正在尝试使用WebGL将场景渲染到帧缓冲区,并查看指定像素(被单击的像素)的颜色值。问题是当我尝试使用gl.readPixels获取所有像素的像素数据,但(0,0)返回空值(0,0,0,0)时。 (0,0)像素(左上角)返回预期的值,这是帧缓冲区使用的清晰颜色。这里是我使用的代码的主要部分:WebGL Framebuffer ClearColor Only仅影响(0,0)像素

gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); 
gl.viewport(0, 0, canvas.width, canvas.height); 

gl.clearColor(1.0, 1.0, 1.0, 1.0); 
gl.clearDepth(1.0); 
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 

// render code goes here 

var pixelData = new Uint8Array(4); 
gl.readPixels(screenPositionX, screenPositionY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixelData); 

gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

如果我使用gl.readPixels上渲染的场景,我得到正确的结果,而不是当我使用它的帧缓存。我想这意味着我可以渲染帧缓冲区,然后使用gl.readPixels,但是我不希望这样做,因为帧缓冲区不是为了被看到而是用于数据收集。任何信息或建议?

编辑: 我找到了解决方案,并在下面发布。

+0

您是否设置了视口? – 2014-12-03 09:27:37

+0

我曾尝试过使用和不使用gl.viewport并获得了相同的结果,但我会继续并更新上面的代码以显示该代码。 – user4319280 2014-12-03 16:02:42

+0

你可以显示你添加帧缓冲的附件吗?帧缓冲区只是附件(渲染缓冲区和/或纹理)的集合。渲染缓冲区和纹理是你想要读取的像素。 – gman 2014-12-05 02:29:46

回答

0

我找到了解决方案,它是那些头脑凌乱的错误之一。在附加颜色附件的纹理时,我附加的纹理仅为1x1像素。这可以解释为什么(0,0)坐标是唯一获取准确数据的坐标。所有其他像素都被考虑在纹理范围之外。一旦我将纹理大小固定到画布的大小,一切都奏效。感谢gman指引我正确看待附件的方向。