跳到主要内容

GPU拾取

3D 场景内的交互拾取一般有两种:射线拾取、GPU 拾取。相比于射线拾取,GPU 拾取的精度会更高,性能消耗也会更大,关于 GPU 拾取的细节可以 查看这里

示例

使用

开启

Tinoe 内置了 GPU 拾取的实现,你可以像下面这样开启

stage.enablePicker();

开启 GPU 拾取对于事件处理的写法没有影响,你可以和以前一样为节点绑定事件和回调。

scene.on(TinoeEventType.CLICK, e => {
if (e.target) {
e.target.material.emissionColor.set(1, 0, 0);
}
});

静态/动态

考虑到 GPU 拾取可能带来的性能消耗,我们提供了动态和静态两种模式供用户选择,默认动态。

GPU 拾取在 Tinoe 内部是以插件形式存在的,切换动静态模式需要你获取到插件实例,你可以:

// 添加时获取
const fbp = stage.pluginManager.addPlugin(FrameBufferPickerPlugin);
// 或者后续获取
const fbp = stage.pluginManager.getPlugin(FrameBufferPickerPlugin);

动态模式下我们会在用户交互行为(比如点击)发生时开启一个 render-pass,这个 pass 会在下一帧被执行,更新场景渲染到的纹理图,根据最新的场景状态拾取到命中的 mesh 并返回,随后执行你的交互处理函数,这个拾取过程将会是异步的。

静态模式适合于场景无变化或变化小的情况,静态模式要求开发者自行确定更新纹理图的时机,在拾取前确保纹理图和当前场景一致。

// 设置静态模式
fbp.mode = FBPMode.STATIC;
// 更新纹理
fbp.record();

如果你对这段描述有疑问,可以 查看这里

API

FrameBufferPickerPlugin

Q&A

更多

技术方案