如何清除与不同几何共享的bufferAttribute的数组(this.array)

时间:2018-08-29 09:17:58

标签: three.js

谁能帮助我,如何清除与不同几何共享的bufferAttribute的数组(this.array)。 我尝试使用“ onUploadCallback”,但在这种情况下会引发错误。

getBufferAttrib(accessor)
{
let key ='bufferView : ' + accessor.bufferView;
let bufferAttribute = this.BufferAttributeCache.get(key);

if(bufferAttribute === undefined){

    let itemSize = WebglConstants.WEBGL_TYPE_SIZES[accessor.type];

    let arrayType = WebglConstants.WEBGL_COMPONENT_TYPES[accessor.componentType];
    let data = new arrayType(accessor.bufferViewData,accessor.bufferOffset, accessor.count * itemSize );
    bufferAttribute = new THREE.BufferAttribute( data, itemSize );    
    bufferAttribute.name = accessor.name;
    bufferAttribute.refCount = 1;
    bufferAttribute.onUploadCallback = function() {
        this.refCount = this.refCount - 1;
        if(this.refCount === 0){
            this.array = null;
        }             
    };      
    this.BufferAttributeCache.add(key, bufferAttribute);

}
else{
    bufferAttribute.refCount = bufferAttribute.refCount + 1;
}

1 个答案:

答案 0 :(得分:2)

根据提供的信息,尤其是调用堆栈,看来这是在渲染期间发生的。

WebGLRenderer.render中,有一个名为projectObject的内部函数,其中包含以下行(r95):

if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {

视锥相交检查尝试与对象的boundingSphere相交,如果不可用,则会生成所说的boundingSphere。这一代需要引用顶点缓冲区,在您的情况下,顶点缓冲区不再存在。

为避免此问题,只需在丢弃对象的缓冲区之前计算每个对象的boundingSphere。当视锥相交发生时,它将找到球体并通过/未通过测试,而不是在尝试创建球体时遇到错误。