babylonjs3.1新增遮挡剔除属性分类目录友情链接
本文通过翻译转载至babylonjs官方文档,原文:https://doc.babylonjs.com/features/occlusionquery
babylonjs 从v3.1版本开始引入了一个全新的概念:遮挡剔除(Occlusion Culling),官方称为:Occlusion Queries(遮挡查询)
这个属性可以以mesh边界框为单元索引场景中被遮挡的物体,并从场景中剔除,我刚刚试了一下,有用,但最好不要在大物件上面使用,容易出现闪动或者遮挡错误比如墙壁或者相机处于某个mesh的(像瓶子)包围中,它可能在小物件上面很有用,比如茶几上面的杯子。
一、如何工作
在绘制对象之前,Babylon.js引擎在目标Mesh上绘制一个透明的边界框,并创建一个查询来检查WebGl索引,判断mesh
的边框是否可见。如果可见,则不绘制该mesh
对象,Occlusion Queries
是异步的,并且通常该对象的查询结果在当前帧中不可用,因此基于查询结果绘制该对象之前的帧,用户不会注意到的差异,除非你的FPS太低。
演示
二、快速开始
在Mesh上使用Occlusion Queries
var sphere = BABYLON.Mesh.CreateSphere('sphere1', 16, 2, scene); sphere.occlusionType = BABYLON.AbstractMesh.OCCLUSION_TYPE_OPTIMISTIC;
更多关于occlusionType
和支持的算法检查AbstractMesh
类文档
如果你的对象默认是在一个不透明的对象后面,你可以将属性设置isOccluded
为true
,以便Babylon.js引擎不会决定是否渲染,直到从WebGl引擎检索到查询结果。
sphere.isOccluded = true;
三、高级用法
如前所述,Occlusion Queries
结果是异步的,可能需要一些时间才能得到结果,因此对象会花费很多帧来等待查询结果。在这种情况下,您可以使用属性occlusionRetryCount
来设置查询中断之前的等待帧数。一旦中断发生,你将需要决定是否绘制对象或保持其状态,属性occlusionType
是就是这个作用,
你有2个选项
1)OCCLUSION_TYPE_OPTIMISTIC
:这个选项将呈现如果中断发生的网格。
2)OCCLUSION_TYPE_STRICT
:这个选项将恢复对象的最后一个状态,不管是可见的还是可见的继续隐藏。
作为使用限制和乐观的场景,如果在场景中有2个昂贵的对象,其中一个是必须呈现对象,因此您可以设置occlusionRetryCount
并设置occlusionType
为乐观状态,以便在查询结果不可用的情况下呈现对象。如果您的对象可以等待查询可用,则不要occlusionRetryCount
在使用occlusionType
为Strict
时设置或设置属性,以便在上一个场景中渲染对象时,在当前场景中再次渲染它,否则将其隐藏。
sphere.occlusionRetryCount = 10; sphere.occlusionType = BABYLON.AbstractMesh.OCCLUSION_TYPE_STRICT;
在Babylon.js中,您还可以使用occlusionQueryAlgorithmType
更多属性来设置WebGl遮挡查询算法类型,以检查AbstractMesh
类文档
演示: http://www.babylonjs-playground.com/#QDAZ80#3
原文地址:https://www.xidayun.com/index.php/2018/01/08/babylonjs3-1/
WEBGL学习网 » babylonjs3.1新增遮挡剔除属性分类目录友情链接