【Three.js】遮挡剔除

背景

考虑到场景中模型顶点过多会让fps过低,所以想把相机看不到的模型从场景中移除,来提高渲染性能,但是后续测试结果让我恍然大悟。虽然场景中的顶点数降低了很多,但是每次渲染检查遮挡的过程本身就是一个消耗性能的行为,有点适得其反了。虽然并没有解决问题,但是在此做一下探索记录。

效果

在这里插入图片描述
在这里插入图片描述

例子

index.html

<!DOCTYPE html>
<html lang="en"><head><title>three.js webgl - geometry hierarchy</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><style>body {background:#fff;padding:0;margin:0;font-weight: bold;overflow:hidden;}</style></head><body><!-- r58 --><script src="./three.js"></script><script type="module">import Stats from '../jsm/libs/stats.module.js'var container, stats, occlusionStats;var camera, scene, renderer;var geometry;var mouseX = 0, mouseY = 0;var debugMode = 0;var windowHalfX = window.innerWidth / 2;var windowHalfY = window.innerHeight / 2;document.addEventListener( 'mousemove', onDocumentMouseMove, false );document.addEventListener( 'click', onDocumentClick, false );init();animate();function init() {container = document.createElement( 'div' );document.body.appendChild( container );camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 10, 10000 );camera.position.z = 500;scene = new THREE.Scene();scene.fog = new THREE.Fog( 0xffffff, 1, 10000 );var geometry = new THREE.CubeGeometry( 100, 100, 100 );var material = new THREE.MeshNormalMaterial();for ( var gz = -10; gz < 10 ; gz++ ) {if ( gz % 3 === 0 ) continue;for ( var gx = -10; gx < 10 ; gx++ ) {if ( gx % 3 === 0 ) continue;var height = Math.random() * 10;for ( var gy = 0; gy < height ; gy++ ) {var mesh = new THREE.Mesh( geometry, material );mesh.occluder = true;mesh.occludable = THREE.EdgeOccludable;mesh.position.x = gx * 100;mesh.position.y = gy * 100;mesh.position.z = gz * 100;mesh.matrixAutoUpdate = false;mesh.updateMatrix();scene.add( mesh );}}}renderer = new THREE.WebGLRenderer();renderer.setSize( window.innerWidth, window.innerHeight );renderer.sortObjects = true;renderer.occlusionCulling = true;container.appendChild( renderer.domElement );stats = new Stats();stats.domElement.style.position = 'absolute';stats.domElement.style.top = '0px';stats.domElement.style.zIndex = 100;container.appendChild( stats.domElement );window.addEventListener( 'resize', onWindowResize, false );occlusionStats = document.createElement('DIV');occlusionStats.style.position = 'absolute';occlusionStats.style.top = '200px';occlusionStats.style.zIndex = 100;occlusionStats.style.whiteSpace = 'pre';occlusionStats.style.fontFamily = 'monospace';container.appendChild( occlusionStats );var instruction = document.createElement('P');instruction.textContent = 'Click to cycle through debug views';instruction.style.position = 'absolute';instruction.style.bottom = '10px';instruction.style.zIndex = 100;instruction.style.fontFamily = 'sans-serif';container.appendChild( instruction );}function onWindowResize() {windowHalfX = window.innerWidth / 2;windowHalfY = window.innerHeight / 2;camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );}function onDocumentMouseMove(event) {mouseX = event.clientX / window.innerWidth;mouseY = event.clientY / window.innerHeight;}function onDocumentClick(event) {debugMode++;if ( debugMode & 1 ) {if ( ! scene.overrideMaterial ) {scene.overrideMaterial = new THREE.MeshBasicMaterial({wireframe:true, color:0xff00ff});}}else if ( scene.overrideMaterial ) {scene.overrideMaterial = null;}if ( debugMode & 2 ) {if ( ! window.threejsOcclusionOverlayCanvas ) {var overlayCanvas = document.createElement('CANVAS');overlayCanvas.style.position = 'absolute';overlayCanvas.style.top = '0';overlayCanvas.style.left = '0';overlayCanvas.style.bottom = '0';overlayCanvas.style.right = '0';overlayCanvas.style.width = '100%';overlayCanvas.style.height = '100%';container.appendChild(overlayCanvas);window.threejsOcclusionOverlayCanvas = overlayCanvas;}}else if ( window.threejsOcclusionOverlayCanvas ) {window.threejsOcclusionOverlayCanvas.parentNode.removeChild(window.threejsOcclusionOverlayCanvas);window.threejsOcclusionOverlayCanvas = null;}}function animate() {requestAnimationFrame( animate );render();stats.update();}function render() {camera.position.x = Math.cos(mouseX * Math.PI) * 2000;camera.position.y = mouseY * 1000;camera.position.z = Math.sin(mouseX * Math.PI) * 2000;camera.lookAt( scene.position );renderer.render( scene, camera );var occlusionStatsText = '';//				console.log(renderer.info);for ( var stat in renderer.info.occlusion ) {occlusionStatsText += stat + ": " + renderer.info.occlusion[ stat ] + "\n";}if ( occlusionStats.textContent !== occlusionStatsText ) {occlusionStats.textContent = occlusionStatsText;}}</script></body>
</html>

three.js

rendererocclusionCulling 属性在r58版本有,最新版的该属性被移除了,移除原因我想也是我开头说的原因吧,有兴趣的同学可以深入研究一下。

webgl实现

https://tsherif.github.io/webgl2examples/occlusion.html这个是webgl的例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60987.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python批量查字典和爬取双语例句

最近&#xff0c;有网友反映&#xff0c;我的批量查字典工具换到其它的网站就不好用了。对此&#xff0c;我想说的是&#xff0c;互联网包罗万象&#xff0c;网站的各种设置也有所不同&#xff0c;并不是所有的在线字典都可以用Python爬取的。事实上&#xff0c;很多网站为了防…

汉字形近字(OCR)

近期做中文OCR识别的优化&#xff0c;抓破头皮却收获甚微。 为了百尺竿头更进一步&#xff0c;遂将目光聚焦在中文汉字特有的形近字和生僻字问题上&#xff0c;于是怒发整理形近字大全&#xff08;花了不少刀&#xff09;&#xff0c;希望对同行朋友们也有帮助&#xff1a; 地表…

【LeetCode 75】第二十三题(2352)相等行列对

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目很简洁&#xff0c;就是要我们寻找行与列相同的对数。相同行与列不仅是要元素相同&#xff0c;还需要顺序也一样&#xff08…

AutoDL服务器的镜像版本太高,配置python3.7 tensorflow1.15版本的框架的步骤

1.选择一个实例&#xff0c;进入后端界面 2. 更新bashrc中的环境变量 conda init bash && source /root/.bashrc查看虚拟环境 conda info --envs可以看到此时有一个base的虚拟环境 但是它的python版本为3.8.10&#xff0c;无法安装tensorflow1.15,所以我们要创建一个…

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

chapter14:springboot与安全

Spring Boot与安全视频 Spring Security, shiro等安全框架。主要功能是”认证“和”授权“&#xff0c;或者说是访问控制。 认证&#xff08;Authentication&#xff09;是建立在一个声明主体的过程&#xff08;一个主体一般指用户&#xff0c;设备或一些可以在你的应用程序中…

【数据结构OJ题】合并两个有序数组

原题链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题&#xff0c;我们注意到nums1[ ]和nums2[ ]两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp[ ]&#x…

Leetcode.1289 下降路径最小和 II

题目链接 Leetcode.1289 下降路径最小和 II rating : 1697 题目描述 给你一个 n x n 整数矩阵 g r i d grid grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 g r i d grid grid 数组中的每一行选择一个数字&#xff…

【密码学】六、公钥密码

公钥密码 1、概述1.1设计要求1.2单向函数和单向陷门函数 2、RSA公钥密码体制2.1加解密2.2安全性分析 3、ElGamal公钥密码体制3.1加解密算法3.2安全性分析 4、椭圆曲线4.1椭圆曲线上的运算4.2ECC 5、SM2公钥密码体制5.1参数选取5.2密钥派生函数5.3加解密过程5.3.1初始化5.3.2加密…

pytest fixture 常用参数

fixture 常用的参数 参数一&#xff1a;autouse&#xff0c;作用&#xff1a;自动运行&#xff0c;无需调用 举例一&#xff1a;我们在类中定义一个function 范围的fixture; 设置它自动执行autouseTrue&#xff0c;那么我们看下它执行结果 输出&#xff1a; 说明&#xff1a;…

WebRTC | 音视频直播客户端框架

端到端通信互动技术可分解为以下几个技术难点&#xff1a;客户端技术、服务器技术、全球设备网络适配技术和通信互动质量监控与展示技术。 一、音视频直播 音视频直播可分成两条技术路线&#xff1a;一条是以音视频会议为代表的实时互动直播&#xff1b;另一条是以娱乐直播为代…

【TypeScript】类型断言-类型的声明和转换(五)

【TypeScript】类型断言-类型的声明和转换&#xff08;五&#xff09; 【TypeScript】类型断言-类型的声明和转换&#xff08;五&#xff09;一、简介二、断言形式2.1 尖括号语法2.2 as形式 三、断言类型3.1 非空断言3.2 肯定断言-肯定化保证赋值3.3 将任何类型断言为any3.4 调…