我正在尝试在 WebGL 中实现拾取。我有很多物品(大约 500 个),我希望每个物品都可以被挑选出来。为了做到这一点,我做了一个循环,为每个对象分配一个唯一的颜色(参见拾取原则):
for (var i = 0, len = objects.length; i < len; i++) {
framecolors[count++] = i % 256 / 256; //Red
framecolors[count++] = Math.floor(i/256) / 256; //Green
framecolors[count++] = Math.floor(i/(256*256)) / 256; //Blue
}
framecolors
然后在经典缓冲区中使用以检查每个对象是否具有不同的红色阴影。有效。
现在,我想使用对象的原始颜色和背景中带有红色阴影的帧缓冲区。我已经通过了一些代码,我有点困惑。
这是我到目前为止所尝试的。
采摘前调用的函数:
//Creates texture
colorTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, colorTexture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 400, 400, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
//Creates framebuffer
fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, colorTexture, 0);
gl.bindTexture(gl.TEXTURE_2D, colorTexture);
gl.enable(gl.DEPTH_TEST);
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
gl.clear(gl.DEPTH_BUFFER_BIT);
gl.drawArrays(gl.POINTS, 0, vertexPositionBuffer.numItems);
之后调用的函数:
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.bindTexture(gl.TEXTURE_2D, colorTexture);
gl.drawArrays(gl.POINTS, 0, vertexPositionBuffer.numItems);
正如您可能理解的那样,我对帧缓冲区不太满意,我只是不太了解它们是如何工作的,尽管我阅读了很多关于它们的信息。我不知道如何链接framecolors
到帧缓冲区。有办法吗?
谢谢,R。