首先谈谈webgl的pick实现原理:即给每一个渲染的物体绑定一个唯一的id,在内存中这个是很容易做到,但是GPU只有渲染的图像,没有像内存一样的东西(这也是为何调试shader只能通过颜色来判断)
因此要绑定这个id,则需要用相应的颜色来记录这个id,颜色的表示方法为rgba(1,1,1,1),每个分量的取值范围为0-255,因此cesium可记录的最大的pickid entity限制为256*256*256*256 =2的32次方,刚好是一个Uint32的记录长度。_nextPickColor会依次递增,当超出最大时候,会抛出异常
cesium渲染时,会将该帧渲染到一个pickframebuffer中,pickframebuffer仅记录id信息,不会渲染到屏幕上,当点击时,可通过webgl自带的context.readPixels()函数将点击位置的像素返回
这样就可以拿到id,将对应id的primitive/3D tiles返回,此时 即完成了pick操作;
上述操作只能做一次pick,dirllPick可以返回在射线上的所有物体,
drill pick 调用堆栈
cesium中是依次将在射线上的primitive隐藏再渲染,直到相交的物体为空或者达到限定的数目(limit)再停止,
当pick完成之后,重新进行渲染。
note:测试的时候发现,drillPick在一定条件下会不正确,留待以后探索,如下图,正常至少返回3个,但实际上只返回了一个