Skip to content

Commit

Permalink
Merge pull request layabox#860 from lirongf/master
Browse files Browse the repository at this point in the history
add distanceVolumeCull
  • Loading branch information
lirongf authored Apr 6, 2022
2 parents a201483 + 899ec7a commit 886bf08
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/layaAir/Config3D.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ export class Config3D implements IClone {
octreeMinNodeSize: number = 2.0;
/** 八叉树松散值。*/
octreeLooseness: number = 1.25;


/**enableDistanceCull 距离裁剪*/
distanceVolumCull:boolean = false;

/**
* 是否开启视锥裁剪调试。
Expand Down
3 changes: 3 additions & 0 deletions src/layaAir/laya/d3/core/render/BaseRender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ export class BaseRender extends EventDispatcher implements ISingletonElement, IO
/**@internal [NATIVE]*/
_cullingBufferIndex: number;

/**@internal 可以根据不同的值来设置*/
_ratioIgnor:number = 0.005;

/**
* 获取唯一标识ID,通常用于识别。
*/
Expand Down
30 changes: 27 additions & 3 deletions src/layaAir/laya/d3/graphics/FrustumCulling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { Bounds } from "../core/Bounds";
import { BoundSphere } from "../math/BoundSphere";
import { ISceneRenderManager } from "../core/scene/SceneRenderManager/ISceneRenderManager";
import { Material } from "../core/material/Material";
import { Config3D } from "../../../Config3D";


/**
Expand Down Expand Up @@ -94,11 +95,14 @@ export class FrustumCulling {
var loopCount: number = Stat.loopCount;
for (var i: number = 0, n: number = renderList.length; i < n; i++) {
var render: BaseRender = <BaseRender>renders[i];
var canPass: boolean;
var canPass: boolean = true;
if(Config3D._config.distanceVolumCull){
canPass = FrustumCulling.cullDistanceVolume(context,render);
}
if (isShadowCasterCull)
canPass = render._castShadow && render._enable;
canPass = render._castShadow && render._enable && canPass;
else
canPass = ((Math.pow(2, render._owner._layer) & cullMask) != 0) && render._enable;
canPass = ((Math.pow(2, render._owner._layer) & cullMask) != 0) && render._enable && canPass;

if (canPass) {
Stat.frustumCulling++;
Expand All @@ -113,6 +117,26 @@ export class FrustumCulling {
}
}

/**
* 视距与包围提裁剪
* @param context
* @param render
* @returns
*/
static cullDistanceVolume(context:RenderContext3D,render:BaseRender):boolean{
let camera = context.camera;
if(!camera||!camera.transform) return false;
let bound = render.bounds;
let center = bound.getCenter();
let exten = bound.getExtent();
let dis:number = Vector3.distance(camera.transform.position,center);
let volum:number = Math.max(exten.x,exten.y,exten.z);
if(volum/dis<render._ratioIgnor){
return false;
}
return true;
}

/**
* @internal
*/
Expand Down

0 comments on commit 886bf08

Please sign in to comment.