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];
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,
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(),
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;
}