|
@@ -46,7 +46,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
fragmentShader: copyShader.fragmentShader,
|
|
|
transparent: true,
|
|
|
defines:{
|
|
|
- useDepth: true
|
|
|
+ useDepth: true //开启后,其他物体才能被遮挡
|
|
|
}
|
|
|
})
|
|
|
/* let copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
|
|
@@ -61,7 +61,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
depthTest: false,
|
|
|
depthWrite: false
|
|
|
}); */
|
|
|
- if(Potree.settings.useRTskybox){
|
|
|
+ if(Potree.settings.useRTskybox != Potree.settings.useRTPoint){//如果两个只开了一个
|
|
|
viewer.images360.addEventListener('endChangeMode',()=>{
|
|
|
this.resize({viewport:viewer.mainViewport})
|
|
|
})
|
|
@@ -72,7 +72,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
resize(e){
|
|
|
if(Features.EXT_DEPTH.isSupported()){
|
|
|
let viewport = e.viewport
|
|
|
- let size = Potree.settings.useRTskybox && Potree.settings.displayMode == 'showPanos' ? viewport.resolution2 : viewport.resolution; //若要渲染skybox,需要和设备一样精度的rt
|
|
|
+ let size = ( Potree.settings.displayMode == 'showPanos' ? Potree.settings.useRTskybox : Potree.settings.useRTPoint) ? viewport.resolution2 : viewport.resolution; //若要渲染skybox,需要和设备一样精度的rt
|
|
|
this.getRtEDL(viewport).setSize( size.x, size.y ); //理论上可以是任意尺寸,但会影响精度,且aspect最好和渲染的一致
|
|
|
}
|
|
|
}
|
|
@@ -192,7 +192,8 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
const viewer = this.viewer;
|
|
|
let camera = params.camera ? params.camera : viewer.scene.getActiveCamera();
|
|
|
const resolution = params.viewport ? params.viewport.resolution : this.viewer.renderer.getSize(new THREE.Vector2());//突然发现mobile用resolution2点云会放大
|
|
|
- let rtEDL = Features.EXT_DEPTH.isSupported() && camera.type != "OrthographicCamera" && !params.dontRenderRtEDL && (params.rtEDL || this.getRtEDL(params.viewport)) // 平面相机不用depthTex直接打开depthTest?且不使用edl
|
|
|
+ let rtEDL = (Potree.settings.pointEnableRT || Potree.settings.displayMode == 'showPanos' || viewer.useEDL) &&
|
|
|
+ Features.EXT_DEPTH.isSupported() && camera.type != "OrthographicCamera" && !params.dontRenderRtEDL && (params.rtEDL || this.getRtEDL(params.viewport)) // 平面相机不用depthTex直接打开depthTest?且不使用edl
|
|
|
let useEDL = viewer.useEDL && rtEDL && Potree.settings.displayMode != 'showPanos'
|
|
|
let target = params.target || null
|
|
|
viewer.renderer.setRenderTarget(target);
|
|
@@ -207,28 +208,31 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
}); */
|
|
|
|
|
|
//skybox 全景图
|
|
|
- if(!params.magnifier){
|
|
|
- Potree.Utils.setCameraLayers(camera, ['skybox'])
|
|
|
- let useDepthTex
|
|
|
- if(Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && rtEDL){//渲染深度图
|
|
|
- useDepthTex = true
|
|
|
-
|
|
|
- viewer.renderer.setRenderTarget(rtEDL) //将带有深度图的skybox画在rtEDL一下,这样就不需要绘制后边的点云了
|
|
|
- viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
- viewer.renderer.setRenderTarget(target);
|
|
|
-
|
|
|
- if(Potree.settings.useRTskybox){//直接使用rtEDL,但是会失去抗锯齿,不知在skybox上需要抗锯齿吗
|
|
|
- this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture
|
|
|
- this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture
|
|
|
- Utils.screenPass.render(viewer.renderer, this.recoverToScreenMat, target);
|
|
|
+ if(!params.magnifier){
|
|
|
+ if(Potree.settings.displayMode == 'showPanos' || Potree.settings.testCube){
|
|
|
+
|
|
|
+ Potree.Utils.setCameraLayers(camera, ['skybox'])
|
|
|
+
|
|
|
+ if(Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && rtEDL){//渲染深度图
|
|
|
+
|
|
|
+ viewer.renderer.setRenderTarget(rtEDL) //将带有深度图的skybox画在rtEDL一下,这样就不需要绘制后边的点云了
|
|
|
+ viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
+ viewer.renderer.setRenderTarget(target);
|
|
|
+
|
|
|
+ if(Potree.settings.useRTskybox){//直接使用rtEDL,但是会失去抗锯齿,不知在skybox上需要抗锯齿吗
|
|
|
+ this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture
|
|
|
+ this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture
|
|
|
+ Utils.screenPass.render(viewer.renderer, this.recoverToScreenMat, target);
|
|
|
+ }else{
|
|
|
+ viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
+ }
|
|
|
+ return
|
|
|
}else{
|
|
|
viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
- }
|
|
|
- }else{
|
|
|
- viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- if(useDepthTex)return
|
|
|
}
|
|
|
|
|
|
|
|
@@ -268,7 +272,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
}
|
|
|
|
|
|
|
|
|
- if(rtEDL/* Features.EXT_DEPTH.isSupported() && !params.dontRenderRtEDL */){ //借用rtEDL存储深度信息
|
|
|
+ if(rtEDL ){ //借用rtEDL存储深度信息
|
|
|
viewer.renderer.setRenderTarget( rtEDL );
|
|
|
|
|
|
if(visiblePointClouds2.length>0){ //渲染scenePointCloud到rtEDL
|
|
@@ -279,7 +283,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
});
|
|
|
}
|
|
|
if(Potree.settings.intersectOnObjs){// model也要渲染到rtEDL
|
|
|
- camera.layers.set(Potree.config.renderLayers.model);
|
|
|
+ Potree.Utils.setCameraLayers(camera, ['model','light'])
|
|
|
viewer.objs.traverse(e=>{if(e.material)e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true}) //否则半透明的mesh无法遮住测量线
|
|
|
viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
viewer.objs.traverse(e=>{if(e.material)e.material.depthWrite = e._OlddepthWrite})
|
|
@@ -299,7 +303,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
|
|
|
|
|
|
if(showPointClouds){ //绘制点云到画布
|
|
|
- if(useEDL) { //设置edlMaterial //Features.EXT_DEPTH不支持的话不会到这一块
|
|
|
+ if(useEDL){ //设置edlMaterial //Features.EXT_DEPTH不支持的话不会到这一块
|
|
|
|
|
|
const uniforms = this.edlMaterial.uniforms;
|
|
|
uniforms.resolution.value.copy(resolution)
|
|
@@ -314,8 +318,18 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
|
|
|
|
|
|
uniforms.uEDLColor.value = rtEDL.texture;
|
|
|
uniforms.opacity.value = viewer.edlOpacity; // HACK
|
|
|
+
|
|
|
Utils.screenPass.render(viewer.renderer, this.edlMaterial, target); //相当于一个描边后期特效。 缺点: 因为target上的没有抗锯齿,所以点云在晃动镜头时会不稳定地闪烁1px位置。优点:比不打开edl少绘制一次点云,更流畅了?!
|
|
|
- }else{
|
|
|
+ }else if(Potree.settings.useRTPoint && rtEDL){
|
|
|
+
|
|
|
+ this.recoverToScreenMat.uniforms.tDiffuse.value = rtEDL.texture;
|
|
|
+ if(this.recoverToScreenMat.defines.useDepth){
|
|
|
+ this.recoverToScreenMat.uniforms.depthTex.value = rtEDL.depthTexture;
|
|
|
+ }
|
|
|
+
|
|
|
+ Utils.screenPass.render(viewer.renderer, this.recoverToScreenMat, target);
|
|
|
+ params.drawedModelOnRT = true
|
|
|
+ }else{
|
|
|
//渲染点云 (直接用rtEDL上的会失去抗锯齿, 导致频闪、密集时出现条纹, 自己写抗锯齿也要渲染好几次。另外透明度也要处理下)
|
|
|
|
|
|
let prop = {
|