如果我有一个着色器丢弃(或制作透明)网格的部分,这(可以理解)不会影响光线投射的行为。应该可以对Z缓冲区进行采样以获得光线投射位置,但是当然我们还有其他副作用,例如不再能够获得关于哪个对象被发现的任何数据"。
基本上,如果我们可以做一个正常的" raycast,然后有能力进行z缓冲检查,然后我们可以开始梳理整套光线投射交叉点,找出真正对应于我们点击的东西的那个我们正在查看的东西。 。
目前还不清楚是否可以使用three.js对Z缓冲区进行采样。是否可以使用WebGL?
答案 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