Javascript 带实例的Three.js-can';t在没有截头台的情况下使其工作=false

Javascript 带实例的Three.js-can';t在没有截头台的情况下使其工作=false,javascript,three.js,Javascript,Three.js,我正在使用three.js和Instance(如中所述),但我遇到了其他人报告的相同问题:对象被随机剪裁,并不断从相机中消失 拟采取的变通办法如下: my_instanced_object.frustumCulled = false; 但这意味着每帧渲染每一个对象,对于很多对象,这会降低我的帧速率 我有什么选择?如果使用实例,如何进行适当的截锥剔除 我正在添加我正在使用的代码,以防有人想看一下 var geometry = new THREE.InstancedBufferGeomet

我正在使用three.js和Instance(如中所述),但我遇到了其他人报告的相同问题:对象被随机剪裁,并不断从相机中消失

拟采取的变通办法如下:

my_instanced_object.frustumCulled = false;
但这意味着每帧渲染每一个对象,对于很多对象,这会降低我的帧速率

我有什么选择?如果使用实例,如何进行适当的截锥剔除

我正在添加我正在使用的代码,以防有人想看一下

var geometry = new THREE.InstancedBufferGeometry();
geometry.maxInstancedCount = all_meshes_data.length;

geometry.addAttribute( 'position', mesh.geometry.attributes.position );
geometry.addAttribute( 'normal', mesh.geometry.attributes.normal );
geometry.addAttribute( 'uv', mesh.geometry.attributes.uv );

var offsets = new THREE.InstancedBufferAttribute( new Float32Array( all_meshes_data.length * 3 ), 3, 1 );

for ( var i = 0, ul = all_meshes_data.length; i < ul; i++ ) { // Populate all instancing positions (where to spawn instances)
    offsets.setXYZ( i, all_meshes_data[i].x, all_meshes_data[i].y, all_meshes_data[i].z );
}

geometry.addAttribute( 'offset', offsets );

var instanceMaterial = new THREE.RawShaderMaterial( {
    vertexShader: document.getElementById( 'vertexShader' ).textContent,
    fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
    transparent: true
} );

geometry.computeVertexNormals();
geometry.boundingSphere = new THREE.Sphere( new THREE.Vector3(), 50 ); // Not working, it works just for a 0;0;0 world positioned mesh that is the 'base' of all of the instanced ones

var instanced_mesh = new THREE.Mesh( geometry, instanceMaterial );

//instanced_mesh.frustumCulled = false; // Works, but the scene becomes very slow (rendering everything even if not in sight)

scene.add( instanced_mesh );
var geometry=new THREE.InstancedBufferGeometry();
geometry.maxInstancedCount=所有网格\u数据.length;
geometry.addAttribute('position',mesh.geometry.attributes.position);
geometry.addAttribute('normal',mesh.geometry.attributes.normal);
geometry.addAttribute('uv',mesh.geometry.attributes.uv);
var offset=新的三个.InstancedBufferAttribute(新的Float32Array(所有网格\u data.length*3),3,1);
对于(var i=0,ul=all_mesh_data.length;i
如果使用实例,有两种方法可以处理截锥剔除

一种是关闭对象的截锥体剔除:

object.frustumCulled = false;
另一个选项是手动设置几何体的边界球体——如果您知道它,或者可以估计它:

geometry.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );

three.js r.86

如果使用实例,有两种方法可以处理截锥体剔除

一种是关闭对象的截锥体剔除:

object.frustumCulled = false;
另一个选项是手动设置几何体的边界球体——如果您知道它,或者可以估计它:

geometry.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );


three.js r.86

如果使用实例化,不应该有很多对象——可能有很多实例。是的,实例化时,它们会变成一个“对象”“场景节点”或任何你想称之为高级结构的东西。你想如何挑选?使用边界框,使用球体?你的对象是动态的吗?你怎么知道这个特殊的东西正在扼杀你的帧速率?在几何体/着色器方面,有多少对象以及它们有多重?你有多少实例容器?@WestLangley yep我是说instances@pailhead我不确定剔除是否能与实例化一起工作。。似乎只要我附加到场景节点的“表示所有实例的基本对象”离开摄影机平截头体。。。所有实例也都消失了,即使其中许多实例在相机中仍然可见。我将帧速率慢度缩小到生成所有这些实例的部分,所以它一定是这样。每个网格是512个三角形,场景中有1056个。假设你的实例是静态的。您正在渲染小行星场或森林。您不必将整个实体呈现为一个实例调用。取一个体积,或者是一个球体,或者是一个最适合某一段的盒子(森林的1/4,小行星场的1/16)。分离实例,剔除体积。如果使用实例,那么不应该有很多对象——可能有很多实例。是的,在实例时,它们会变成一个“对象”“场景节点”或任何你想称之为高级结构的东西。你想如何挑选?使用边界框,使用球体?你的对象是动态的吗?你怎么知道这个特殊的东西正在扼杀你的帧速率?在几何体/着色器方面,有多少对象以及它们有多重?你有多少实例容器?@WestLangley yep我是说instances@pailhead我不确定剔除是否能与实例化一起工作。。似乎只要我附加到场景节点的“表示所有实例的基本对象”离开摄影机平截头体。。。所有实例也都消失了,即使其中许多实例在相机中仍然可见。我将帧速率慢度缩小到生成所有这些实例的部分,所以它一定是这样。每个网格是512个三角形,场景中有1056个。假设你的实例是静态的。您正在渲染小行星场或森林。您不必将整个实体呈现为一个实例调用。取一个体积,或者是一个球体,或者是一个最适合某一段的盒子(森林的1/4,小行星场的1/16)。分开你的实例,挑选卷。你怎么这么快就收到问题通知?谢谢,我知道第一个解决方法,但第二个。。除非我设置了一个足够大的边界球,使所有实例都可见(因此这基本上类似于完全禁用平截头体剔除),否则不会对每个实例复制边界球。是否有任何方法可以让每个绘制的实例复制boundingsphere?(我还添加了一些我正在使用的代码)否。在控制台中键入
renderer.info
,您应该会看到所有实例都在一次绘制调用中呈现。@WestLangley抱歉,我正忙于一些工作。完成!泰!你怎么这么快就收到问题通知?谢谢,我知道第一种解决方法,但第二种。。除非我设置了一个足够大的边界层,使所有的实例都可见(这基本上就像禁用平截头体一样)