ThreeJS renderObject 源码

  • visible为false就不drawcall了
if ( object.visible === false ) return;
复制代码
  • layers设置不在就不drwcall了
const visible = object.layers.test( camera.layers );
复制代码
  • 判断是否为多材质
if ( Array.isArray( material ) ) {}
复制代码
  • 多材质计算
const geometry = _objects.update( object );
const material = object.material;
if ( Array.isArray( material ) ) {
        const groups = geometry.groups;
        for ( let k = 0, kl = groups.length; k < kl; k ++ ) {
                const group = groups[ k ];
                const groupMaterial = material[ group.materialIndex ];
复制代码
function renderObject( object, camera, shadowCamera, light, type ) {
        if ( object.visible === false ) return;
        const visible = object.layers.test( camera.layers );
        if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {
                if (
                        ( object.castShadow ||
                                ( object.receiveShadow && type === VSMShadowMap ) ) &&
                        ( ! object.frustumCulled || _frustum.intersectsObject( object ) )
                ) {
                        object.modelViewMatrix.multiplyMatrices(
                                shadowCamera.matrixWorldInverse,
                                object.matrixWorld
                        );
                        const geometry = _objects.update( object );
                        const material = object.material;
                        if ( Array.isArray( material ) ) {
                                const groups = geometry.groups;
                                for ( let k = 0, kl = groups.length; k < kl; k ++ ) {
                                        const group = groups[ k ];
                                        const groupMaterial = material[ group.materialIndex ];
                                        if ( groupMaterial && groupMaterial.visible ) {
                                                const depthMaterial = getDepthMaterial(
                                                        object,
                                                        geometry,
                                                        groupMaterial,
                                                        light,
                                                        shadowCamera.near,
                                                        shadowCamera.far,
                                                        type
                                                );
                                                _renderer.renderBufferDirect(
                                                        shadowCamera,
                                                        null,
                                                        geometry,
                                                        depthMaterial,
                                                        object,
                                                        group
                                                );
                                        }
                                }
                        } else if ( material.visible ) {
                                const depthMaterial = getDepthMaterial(
                                        object,
                                        geometry,
                                        material,
                                        light,
                                        shadowCamera.near,
                                        shadowCamera.far,
                                        type
                                );
                                _renderer.renderBufferDirect(
                                        shadowCamera,
                                        null,
                                        geometry,
                                        depthMaterial,
                                        object,
                                        null
                                );
                        }
                }
        }
        const children = object.children;
        for ( let i = 0, l = children.length; i < l; i ++ ) {
                renderObject( children[ i ], camera, shadowCamera, light, type );
        }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享