使用GPU方式,高亮鼠标指向的物体。

This commit is contained in:
tengge1 2019-11-22 21:31:35 +08:00
parent d516aa42d4
commit cf55580f9d
3 changed files with 15 additions and 12 deletions

View File

@ -17,6 +17,7 @@ Supported Languages: 中文 / [繁體中文](README-tw.md) / [English](README-en
4. 双击场景中的物体,不再跳转到这个物体的视角。
5. 修复无法设置环境贴图和环境贴图强度bug。
6. 修复资源面板最大化时每行只有两个bug。
7. 使用GPU方式高亮鼠标指向的物体。
## v0.3.7更新

View File

@ -34,7 +34,7 @@ function EventDispatcher() {
new ResizeEvent(),
new FilterEvent(),
new ViewEvent(),
// new GPUPickEvent(),
new GPUPickEvent(),
// viewport中的事件
new TransformControlsEvent(),

View File

@ -52,9 +52,14 @@ GPUPickEvent.prototype.onAfterRender = function () {
}
// 记录旧属性
const oldBackground = scene.background;
const oldOverrideMaterial = scene.overrideMaterial;
const oldRenderTarget = renderer.getRenderTarget();
scene.background = null; // 有背景图,可能导致提取的颜色不准
scene.overrideMaterial = null;
renderer.setRenderTarget(this.renderTarget);
// 更换选取材质
scene.traverseVisible(n => {
if (!(n instanceof THREE.Mesh)) {
@ -74,19 +79,20 @@ GPUPickEvent.prototype.onAfterRender = function () {
}
}
});
n.pickColor = maxHexColor;
maxHexColor++;
n.material = n.pickMaterial = material;
});
// 绘制并读取像素
renderer.setRenderTarget(this.renderTarget);
renderer.clear(); // 一定要清缓冲区renderer没开启自动清空缓冲区
renderer.render(scene, camera);
renderer.readRenderTargetPixels(this.renderTarget, this.offsetX, height - this.offsetY, 1, 1, this.pixel);
// 还原原来材质,并获取选中物体
let red = this.pixel[0] / 255,
green = this.pixel[1] / 255,
blue = this.pixel[2] / 255;
const currentColor = this.pixel[0] * 0xffff + this.pixel[1] * 0xff + this.pixel[2];
// console.log(`${this.pixel[0]},${this.pixel[1]},${this.pixel[2]},${currentColor},${maxHexColor}`);
let selected = null;
@ -94,13 +100,8 @@ GPUPickEvent.prototype.onAfterRender = function () {
if (!(n instanceof THREE.Mesh)) {
return;
}
if (n.pickMaterial) {
let color = n.pickMaterial.uniforms.pickColor.value;
if (Math.abs(red - color.r) < 0.001 &&
Math.abs(green - color.g) < 0.001 &&
Math.abs(blue - color.b) < 0.001) {
selected = n;
}
if (n.pickMaterial && n.pickColor === currentColor) {
selected = n;
}
if (n.oldMaterial) {
n.material = n.oldMaterial;
@ -121,6 +122,7 @@ GPUPickEvent.prototype.onAfterRender = function () {
}
// 还原原来的属性
scene.background = oldBackground;
scene.overrideMaterial = oldOverrideMaterial;
renderer.setRenderTarget(oldRenderTarget);
};