Three.js:让Raycaster采样深度缓冲区代替现在的功能

Three.js:让Raycaster采样深度缓冲区代替现在的功能,three.js,Three.js,如果有一个着色器丢弃(或以其他方式使其透明)网格的部分,则这(可以理解)不会影响光线投射的行为。应该可以对Z缓冲区进行采样以获得光线投射位置,当然我们也会有其他副作用,例如无法再获得有关“找到”对象的任何数据 基本上,如果我们可以进行“正常”光线投射,然后能够进行z缓冲区检查,那么我们就可以开始梳理整个光线投射交点集,找出与我们正在查看的单击的东西真正对应的一个 目前尚不清楚是否可以使用three.js对Z缓冲区进行采样。使用WebGL是否可能?否,Raycaster无法对深度缓冲区进行采样 但

如果有一个着色器丢弃(或以其他方式使其透明)网格的部分,则这(可以理解)不会影响光线投射的行为。应该可以对Z缓冲区进行采样以获得光线投射位置,当然我们也会有其他副作用,例如无法再获得有关“找到”对象的任何数据

基本上,如果我们可以进行“正常”光线投射,然后能够进行z缓冲区检查,那么我们就可以开始梳理整个光线投射交点集,找出与我们正在查看的单击的东西真正对应的一个


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

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

但是,您可以使用另一种称为“GPU拾取”的技术

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

//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 );
//渲染屏幕外的拾取场景
render.render(pickingScene、camera、pickingTexture);
//创建用于读取单个像素的缓冲区
var pixelBuffer=新的Uint8Array(4);
//从纹理中读取鼠标下的像素
readRenderTargetPixels(pickingTexture,mouse.x,pickingTexture.height-mouse.y,1,1,pixelBuffer);
//将像素解释为ID

var id=(pixelBuffer[0]谢谢你的回答。GPU拾取对我来说不是很满意。我发现我们应该能够读取深度缓冲区。three.js可以这样做吗?似乎应该足以为我提供一种实现深度检索的方法(从而重新计算相机光线投射的世界空间第一影响)