From cf55580f9d2a3f2dfb140a3f72bc00ae6ac237bb Mon Sep 17 00:00:00 2001 From: tengge1 <930372551@qq.com> Date: Fri, 22 Nov 2019 21:31:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8GPU=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E9=AB=98=E4=BA=AE=E9=BC=A0=E6=A0=87=E6=8C=87=E5=90=91?= =?UTF-8?q?=E7=9A=84=E7=89=A9=E4=BD=93=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + ShadowEditor.Web/src/event/EventDispatcher.js | 2 +- ShadowEditor.Web/src/event/GPUPickEvent.js | 24 ++++++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index fda1755c..a25757e4 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Supported Languages: 中文 / [繁體中文](README-tw.md) / [English](README-en 4. 双击场景中的物体,不再跳转到这个物体的视角。 5. 修复无法设置环境贴图和环境贴图强度bug。 6. 修复资源面板最大化时,每行只有两个bug。 +7. 使用GPU方式,高亮鼠标指向的物体。 ## v0.3.7更新 diff --git a/ShadowEditor.Web/src/event/EventDispatcher.js b/ShadowEditor.Web/src/event/EventDispatcher.js index 81b958ab..e1626445 100644 --- a/ShadowEditor.Web/src/event/EventDispatcher.js +++ b/ShadowEditor.Web/src/event/EventDispatcher.js @@ -34,7 +34,7 @@ function EventDispatcher() { new ResizeEvent(), new FilterEvent(), new ViewEvent(), - // new GPUPickEvent(), + new GPUPickEvent(), // viewport中的事件 new TransformControlsEvent(), diff --git a/ShadowEditor.Web/src/event/GPUPickEvent.js b/ShadowEditor.Web/src/event/GPUPickEvent.js index d4203928..0554a786 100644 --- a/ShadowEditor.Web/src/event/GPUPickEvent.js +++ b/ShadowEditor.Web/src/event/GPUPickEvent.js @@ -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); };