ThreeJS getParameters

496 阅读1分钟
  • 获取对应的属性,最后转为JSON
    function getParameters(material, lights, shadows, scene, nClipPlanes, nClipIntersection, object) {
            const fog = scene.fog;
            const environment = material.isMeshStandardMaterial ? scene.environment : null;

            const envMap = material.envMap || environment;

            const shaderID = shaderIDs[material.type];

            // heuristics to create shader parameters according to lights in the scene
            // (not to blow over maxLights budget)

            const maxBones = object.isSkinnedMesh ? allocateBones(object) : 0;

            if (material.precision !== null) {
                    precision = capabilities.getMaxPrecision(material.precision);

                    if (precision !== material.precision) {
                            console.warn(
                                    'THREE.WebGLProgram.getParameters:',
                                    material.precision,
                                    'not supported, using',
                                    precision,
                                    'instead.'
                            );
                    }
            }

            let vertexShader, fragmentShader;

            if (shaderID) {
                    const shader = ShaderLib[shaderID];

                    vertexShader = shader.vertexShader;
                    fragmentShader = shader.fragmentShader;
            } else {
                    vertexShader = material.vertexShader;
                    fragmentShader = material.fragmentShader;
            }

            const currentRenderTarget = renderer.getRenderTarget();

            const anisotropy = !!material.anisotropy;
            const anisotropyMap = !!material.anisotropyMap;

            const parameters = {
                    isWebGL2: isWebGL2,

                    shaderID: shaderID,
                    shaderName: material.type,

                    vertexShader: vertexShader,
                    fragmentShader: fragmentShader,
                    defines: material.defines,

                    isRawShaderMaterial: material.isRawShaderMaterial,
                    isShaderMaterial: material.isShaderMaterial,

                    precision: precision,

                    instancing: object.isInstancedMesh === true,
                    instancingColor: object.isInstancedMesh === true && object.instanceColor !== null,

                    supportsVertexTextures: vertexTextures,
                    outputEncoding:
                            currentRenderTarget !== null
                                    ? getTextureEncodingFromMap(currentRenderTarget.texture)
                                    : renderer.outputEncoding,
                    map: !!material.map,
                    mapEncoding: getTextureEncodingFromMap(material.map),
                    matcap: !!material.matcap,
                    matcapEncoding: getTextureEncodingFromMap(material.matcap),
                    envMap: !!envMap,
                    envMapMode: envMap && envMap.mapping,
                    envMapEncoding: getTextureEncodingFromMap(envMap),
                    envMapCubeUV:
                            !!envMap && (envMap.mapping === CubeUVReflectionMapping || envMap.mapping === CubeUVRefractionMapping),
                    lightMap: !!material.lightMap,
                    lightMapEncoding: getTextureEncodingFromMap(material.lightMap),
                    aoMap: !!material.aoMap,
                    ssaoMap: !! material.ssaoMap,
                    emissiveMap: !!material.emissiveMap,
                    emissiveMapEncoding: getTextureEncodingFromMap(material.emissiveMap),
                    bumpMap: !!material.bumpMap,
                    normalMap: !!material.normalMap,
                    objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
                    tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,
                    clearcoatMap: !!material.clearcoatMap,
                    clearcoatRoughnessMap: !!material.clearcoatRoughnessMap,
                    clearcoatNormalMap: !!material.clearcoatNormalMap,
                    displacementMap: !!material.displacementMap,
                    roughnessMap: !!material.roughnessMap,
                    metalnessMap: !!material.metalnessMap,
                    specularMap: !!material.specularMap,
                    alphaMap: !!material.alphaMap,

                    gradientMap: !!material.gradientMap,

                    sheen: !!material.sheen,

                    transmissionMap: !!material.transmissionMap,

                    combine: material.combine,

                    // D4_Added
                    ssrMap: !!material.ssrMap,
                    anisotropyRotationMap: !!material.anisotropyRotationMap,
                    vertexTangents: (material.normalMap || anisotropy || anisotropyMap) && material.vertexTangents,
                    vertexColors: material.vertexColors,
                    vertexUvs:
                            !!material.map ||
                            !!material.bumpMap ||
                            !!material.normalMap ||
                            !!material.specularMap ||
                            !!material.alphaMap ||
                            !!material.emissiveMap ||
                            !!material.roughnessMap ||
                            !!material.metalnessMap ||
                            !!material.clearcoatMap ||
                            !!material.clearcoatRoughnessMap ||
                            !!material.clearcoatNormalMap ||
                            !!material.displacementMap ||
                            !!material.transmissionMap ||
                            !!material.glossinessMap ||
                            anisotropyMap ||
                            anisotropy,
                    uvsVertexOnly:
                            !(
                                    !!material.map ||
                                    !!material.bumpMap ||
                                    !!material.normalMap ||
                                    !!material.specularMap ||
                                    !!material.alphaMap ||
                                    !!material.emissiveMap ||
                                    !!material.roughnessMap ||
                                    !!material.metalnessMap ||
                                    !!material.clearcoatNormalMap ||
                                    !!material.transmissionMap
                            ) && !!material.displacementMap,
                    useRefraction: material.useRefraction !== undefined ? material.useRefraction : false,
                    useAnisotropy: material.useAnisotropy !== undefined ? material.useAnisotropy : false,
                    anisotropy: anisotropy,
                    anisotropyMap: anisotropyMap,
                    anisotropyRotationMap: !!material.anisotropyRotationMap,
                    unit: material.unit,
                    uvTrans: material.uvTrans,
                    materialVersion: material.materialVersion,
                    matType: material.matType,
                    decolor: material.decolor !== undefined ? material.decolor : false,

                    needAdjustColor: material.needAdjustColor !== undefined ? material.needAdjustColor : false,
                    gradationInputBlack: material.gradationInputBlack !== undefined ? material.gradationInputBlack : 0.,
                    gradationInputWhite: material.gradationInputWhite !== undefined ? material.gradationInputWhite : 255.,
                    gradationGamma: material.gradationGamma !== undefined ? material.gradationGamma : 1.0,
                    gradationOutputBlack: material.gradationOutputBlack !== undefined ? material.gradationOutputBlack : 0.,
                    gradationOutputWhite: material.gradationOutputWhite !== undefined ? material.gradationOutputWhite : 255.,

                    useD4Emissive: material.useD4Emissive !== undefined ? material.useD4Emissive : false,
                    d4EmissiveMultiplier: material.d4EmissiveMultiplier !== undefined ? material.d4EmissiveMultiplier : 0.,

                    smoothMultiplier: material.smoothMultiplier !== undefined ? material.smoothMultiplier : 1.,

                    appliqueType: material.appliqueType,
                    normalIntensity: material.normalIntensity !== undefined ? material.normalIntensity : 1.0,
                    decalTecUVRepeat: material.decalTecUVRepeat,

                    useGradient: material.useGradient !== undefined ? material.useGradient : false,
                    gradientPercents: material.gradientPercents !== undefined ? material.gradientPercents : [],
                    gradientColors: material.gradientColors !== undefined ? material.gradientColors : [],
                    gradientRangePos: material.gradientRangePos !== undefined ? material.gradientRangePos : [],
                    gradientView: material.gradientView !== undefined ? material.gradientView : 0,
                    gradientRotation: material.gradientRotation !== undefined ? material.gradientRotation : 0,

                    fog: !!fog,
                    useFog: material.fog,
                    fogExp2: fog && fog.isFogExp2,

                    flatShading: material.flatShading,

                    sizeAttenuation: material.sizeAttenuation,
                    logarithmicDepthBuffer: logarithmicDepthBuffer,

                    skinning: material.skinning && maxBones > 0,
                    maxBones: maxBones,
                    useVertexTexture: floatVertexTextures,

                    morphTargets: material.morphTargets,
                    morphNormals: material.morphNormals,
                    maxMorphTargets: renderer.maxMorphTargets,
                    maxMorphNormals: renderer.maxMorphNormals,

                    numDirLights: lights.directional.length,
                    numPointLights: lights.point.length,
                    numSpotLights: lights.spot.length,
                    numRectAreaLights: lights.rectArea.length,
                    numHemiLights: lights.hemi.length,

                    numDirLightShadows: lights.directionalShadowMap.length,
                    numPointLightShadows: lights.pointShadowMap.length,
                    numSpotLightShadows: lights.spotShadowMap.length,

                    numClippingPlanes: nClipPlanes,
                    numClipIntersection: nClipIntersection,

                    dithering: material.dithering,

                    shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,
                    shadowMapType: renderer.shadowMap.type,

                    toneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,
                    physicallyCorrectLights: renderer.physicallyCorrectLights,

                    premultipliedAlpha: material.premultipliedAlpha,

                    alphaTest: material.alphaTest,
                    doubleSided: material.side === DoubleSide,
                    flipSided: material.side === BackSide,

                    depthPacking: material.depthPacking !== undefined ? material.depthPacking : false,

                    index0AttributeName: material.index0AttributeName,

                    extensionDerivatives: material.extensions && material.extensions.derivatives,
                    extensionFragDepth: material.extensions && material.extensions.fragDepth,
                    extensionDrawBuffers: material.extensions && material.extensions.drawBuffers,
                    extensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,

                    rendererExtensionFragDepth: isWebGL2 || extensions.get('EXT_frag_depth') !== null,
                    rendererExtensionDrawBuffers: isWebGL2 || extensions.get('WEBGL_draw_buffers') !== null,
                    rendererExtensionShaderTextureLod: isWebGL2 || extensions.get('EXT_shader_texture_lod') !== null,

                    customProgramCacheKey: material.customProgramCacheKey(),

                    // Added
                    d4_envMapFormat: !!envMap && envMap.d4_envMapFormat,
                    d4_LUTDatatype: !!envMap && envMap.d4_LUTDatatype,
            };



            if ((anisotropy || anisotropyMap) && !parameters.vertexTangents && !warnedAnisotropy) {
                    console.warn(
                            'Warning: implicit tangents for anisotropy will be flat shaded. Consider using BufferGeometryUtils.computeTangents().',
                            material
                    );
                    warnedAnisotropy = true;
            }

            return parameters;
    }