Three.js:制作Raycaster样本深度缓冲区,而不是现在的样本

时间:2017-04-19 07:44:48

标签: three.js webgl

如果我有一个着色器丢弃(或制作透明)网格的部分,这(可以理解)不会影响光线投射的行为。应该可以对Z缓冲区进行采样以获得光线投射位置,但是当然我们还有其他副作用,例如不再能够获得关于哪个对象被发现的任何数据"。

基本上,如果我们可以做一个正常的" raycast,然后有能力进行z缓冲检查,然后我们可以开始梳理整套光线投射交叉点,找出真正对应于我们点击的东西的那个我们正在查看的东西。 。

目前还不清楚是否可以使用three.js对Z缓冲区进行采样。是否可以使用WebGL?

1 个答案:

答案 0 :(得分:0)

不,Raycaster无法对深度缓冲区进行采样。

但是,您可以使用另一种称为" GPU-Picking"的技术。

通过为每个对象指定唯一的颜色,您可以确定选择了哪个对象。你可以使用这样的模式:

//render the picking scene off-screen

renderer.render( pickingScene, camera, pickingTexture );

//create buffer for reading single pixel
var pixelBuffer = new Uint8Array( 4 );

//read the pixel under the mouse from the texture
renderer.readRenderTargetPixels(pickingTexture, mouse.x, pickingTexture.height - mouse.y, 1, 1, pixelBuffer);

//interpret the pixel as an ID

var id = ( pixelBuffer[0] << 16 ) | ( pixelBuffer[1] << 8 ) | ( pixelBuffer[2] );
var data = pickingData[ id ];

renderer.render( scene, camera );

请参阅以下三个例子:

http://threejs.org/examples/webgl_interactive_cubes_gpu.html http://threejs.org/examples/webgl_interactive_instances_gpu.html

three.js r.84