|
@@ -1,4 +1,5 @@
|
|
import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, LinearEncoding, sRGBEncoding, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, RGBAFormat, UnsignedByteType } from '../../constants.js';
|
|
import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, LinearEncoding, sRGBEncoding, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, RGBAFormat, UnsignedByteType } from '../../constants.js';
|
|
|
|
+import { Layers } from '../../core/Layers.js';
|
|
import { WebGLProgram } from './WebGLProgram.js';
|
|
import { WebGLProgram } from './WebGLProgram.js';
|
|
import { ShaderLib } from '../shaders/ShaderLib.js';
|
|
import { ShaderLib } from '../shaders/ShaderLib.js';
|
|
import { UniformsUtils } from '../shaders/UniformsUtils.js';
|
|
import { UniformsUtils } from '../shaders/UniformsUtils.js';
|
|
@@ -6,6 +7,7 @@ import { hashString } from '../../utils.js';
|
|
|
|
|
|
function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {
|
|
function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {
|
|
|
|
|
|
|
|
+ const _programLayers = new Layers();
|
|
const programs = [];
|
|
const programs = [];
|
|
|
|
|
|
const isWebGL2 = capabilities.isWebGL2;
|
|
const isWebGL2 = capabilities.isWebGL2;
|
|
@@ -13,7 +15,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
const floatVertexTextures = capabilities.floatVertexTextures;
|
|
const floatVertexTextures = capabilities.floatVertexTextures;
|
|
const maxVertexUniforms = capabilities.maxVertexUniforms;
|
|
const maxVertexUniforms = capabilities.maxVertexUniforms;
|
|
const vertexTextures = capabilities.vertexTextures;
|
|
const vertexTextures = capabilities.vertexTextures;
|
|
-
|
|
|
|
let precision = capabilities.precision;
|
|
let precision = capabilities.precision;
|
|
|
|
|
|
const shaderIDs = {
|
|
const shaderIDs = {
|
|
@@ -34,25 +35,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
SpriteMaterial: 'sprite'
|
|
SpriteMaterial: 'sprite'
|
|
};
|
|
};
|
|
|
|
|
|
- const parameterNames = [
|
|
|
|
- 'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor',
|
|
|
|
- 'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV',
|
|
|
|
- 'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap',
|
|
|
|
- 'objectSpaceNormalMap', 'tangentSpaceNormalMap',
|
|
|
|
- 'clearcoat', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap',
|
|
|
|
- 'displacementMap', 'specularMap', 'roughnessMap', 'metalnessMap', 'gradientMap',
|
|
|
|
- 'alphaMap', 'alphaTest', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2',
|
|
|
|
- 'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning',
|
|
|
|
- 'maxBones', 'useVertexTexture', 'morphTargets', 'morphNormals', 'morphTargetsCount', 'premultipliedAlpha',
|
|
|
|
- 'numDirLights', 'numPointLights', 'numSpotLights', 'numHemiLights', 'numRectAreaLights',
|
|
|
|
- 'numDirLightShadows', 'numPointLightShadows', 'numSpotLightShadows',
|
|
|
|
- 'shadowMapEnabled', 'shadowMapType', 'toneMapping', 'physicallyCorrectLights',
|
|
|
|
- 'doubleSided', 'flipSided', 'numClippingPlanes', 'numClipIntersection', 'depthPacking', 'dithering', 'format',
|
|
|
|
- 'specularIntensityMap', 'specularColorMap', 'specularColorMapEncoding',
|
|
|
|
- 'transmission', 'transmissionMap', 'thicknessMap',
|
|
|
|
- 'sheen', 'sheenColorMap', 'sheenColorMapEncoding', 'sheenRoughnessMap'
|
|
|
|
- ];
|
|
|
|
-
|
|
|
|
function getMaxBones( object ) {
|
|
function getMaxBones( object ) {
|
|
|
|
|
|
const skeleton = object.skeleton;
|
|
const skeleton = object.skeleton;
|
|
@@ -332,12 +314,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
|
|
|
if ( parameters.isRawShaderMaterial === false ) {
|
|
if ( parameters.isRawShaderMaterial === false ) {
|
|
|
|
|
|
- for ( let i = 0; i < parameterNames.length; i ++ ) {
|
|
|
|
-
|
|
|
|
- array.push( parameters[ parameterNames[ i ] ] );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ getProgramCacheKeyParameters( array, parameters );
|
|
|
|
+ getProgramCacheKeyBooleans( array, parameters );
|
|
array.push( renderer.outputEncoding );
|
|
array.push( renderer.outputEncoding );
|
|
array.push( renderer.gammaFactor );
|
|
array.push( renderer.gammaFactor );
|
|
|
|
|
|
@@ -349,6 +327,161 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ function getProgramCacheKeyParameters( array, parameters ) {
|
|
|
|
+
|
|
|
|
+ array.push( parameters.precision );
|
|
|
|
+ array.push( parameters.outputEncoding );
|
|
|
|
+ array.push( parameters.mapEncoding );
|
|
|
|
+ array.push( parameters.matcapEncoding );
|
|
|
|
+ array.push( parameters.envMapMode );
|
|
|
|
+ array.push( parameters.envMapEncoding );
|
|
|
|
+ array.push( parameters.lightMapEncoding );
|
|
|
|
+ array.push( parameters.emissiveMapEncoding );
|
|
|
|
+ array.push( parameters.combine );
|
|
|
|
+ array.push( parameters.vertexUvs );
|
|
|
|
+ array.push( parameters.fogExp2 );
|
|
|
|
+ array.push( parameters.sizeAttenuation );
|
|
|
|
+ array.push( parameters.maxBones );
|
|
|
|
+ array.push( parameters.morphTargetsCount );
|
|
|
|
+ array.push( parameters.numDirLights );
|
|
|
|
+ array.push( parameters.numPointLights );
|
|
|
|
+ array.push( parameters.numSpotLights );
|
|
|
|
+ array.push( parameters.numHemiLights );
|
|
|
|
+ array.push( parameters.numRectAreaLights );
|
|
|
|
+ array.push( parameters.numDirLightShadows );
|
|
|
|
+ array.push( parameters.numPointLightShadows );
|
|
|
|
+ array.push( parameters.numSpotLightShadows );
|
|
|
|
+ array.push( parameters.shadowMapType );
|
|
|
|
+ array.push( parameters.toneMapping );
|
|
|
|
+ array.push( parameters.numClippingPlanes );
|
|
|
|
+ array.push( parameters.numClipIntersection );
|
|
|
|
+ array.push( parameters.format );
|
|
|
|
+ array.push( parameters.specularColorMapEncoding );
|
|
|
|
+ array.push( parameters.sheenColorMapEncoding );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getProgramCacheKeyBooleans( array, parameters ) {
|
|
|
|
+
|
|
|
|
+ _programLayers.disableAll();
|
|
|
|
+
|
|
|
|
+ if ( parameters.isWebGL2 )
|
|
|
|
+ _programLayers.enable( 0 );
|
|
|
|
+ if ( parameters.supportsVertexTextures )
|
|
|
|
+ _programLayers.enable( 1 );
|
|
|
|
+ if ( parameters.instancing )
|
|
|
|
+ _programLayers.enable( 2 );
|
|
|
|
+ if ( parameters.instancingColor )
|
|
|
|
+ _programLayers.enable( 3 );
|
|
|
|
+ if ( parameters.map )
|
|
|
|
+ _programLayers.enable( 4 );
|
|
|
|
+ if ( parameters.matcap )
|
|
|
|
+ _programLayers.enable( 5 );
|
|
|
|
+ if ( parameters.envMap )
|
|
|
|
+ _programLayers.enable( 6 );
|
|
|
|
+ if ( parameters.envMapCubeUV )
|
|
|
|
+ _programLayers.enable( 7 );
|
|
|
|
+ if ( parameters.lightMap )
|
|
|
|
+ _programLayers.enable( 8 );
|
|
|
|
+ if ( parameters.aoMap )
|
|
|
|
+ _programLayers.enable( 9 );
|
|
|
|
+ if ( parameters.emissiveMap )
|
|
|
|
+ _programLayers.enable( 10 );
|
|
|
|
+ if ( parameters.bumpMap )
|
|
|
|
+ _programLayers.enable( 11 );
|
|
|
|
+ if ( parameters.normalMap )
|
|
|
|
+ _programLayers.enable( 12 );
|
|
|
|
+ if ( parameters.objectSpaceNormalMap )
|
|
|
|
+ _programLayers.enable( 13 );
|
|
|
|
+ if ( parameters.tangentSpaceNormalMap )
|
|
|
|
+ _programLayers.enable( 14 );
|
|
|
|
+ if ( parameters.clearcoat )
|
|
|
|
+ _programLayers.enable( 15 );
|
|
|
|
+ if ( parameters.clearcoatMap )
|
|
|
|
+ _programLayers.enable( 16 );
|
|
|
|
+ if ( parameters.clearcoatRoughnessMap )
|
|
|
|
+ _programLayers.enable( 17 );
|
|
|
|
+ if ( parameters.clearcoatNormalMap )
|
|
|
|
+ _programLayers.enable( 18 );
|
|
|
|
+ if ( parameters.displacementMap )
|
|
|
|
+ _programLayers.enable( 19 );
|
|
|
|
+ if ( parameters.specularMap )
|
|
|
|
+ _programLayers.enable( 20 );
|
|
|
|
+ if ( parameters.roughnessMap )
|
|
|
|
+ _programLayers.enable( 21 );
|
|
|
|
+ if ( parameters.metalnessMap )
|
|
|
|
+ _programLayers.enable( 22 );
|
|
|
|
+ if ( parameters.gradientMap )
|
|
|
|
+ _programLayers.enable( 23 );
|
|
|
|
+ if ( parameters.alphaMap )
|
|
|
|
+ _programLayers.enable( 24 );
|
|
|
|
+ if ( parameters.alphaTest )
|
|
|
|
+ _programLayers.enable( 25 );
|
|
|
|
+ if ( parameters.vertexColors )
|
|
|
|
+ _programLayers.enable( 26 );
|
|
|
|
+ if ( parameters.vertexAlphas )
|
|
|
|
+ _programLayers.enable( 27 );
|
|
|
|
+ if ( parameters.vertexUvs )
|
|
|
|
+ _programLayers.enable( 28 );
|
|
|
|
+ if ( parameters.vertexTangents )
|
|
|
|
+ _programLayers.enable( 29 );
|
|
|
|
+ if ( parameters.uvsVertexOnly )
|
|
|
|
+ _programLayers.enable( 30 );
|
|
|
|
+ if ( parameters.fog )
|
|
|
|
+ _programLayers.enable( 31 );
|
|
|
|
+
|
|
|
|
+ array.push( _programLayers.mask );
|
|
|
|
+ _programLayers.disableAll();
|
|
|
|
+
|
|
|
|
+ if ( parameters.useFog )
|
|
|
|
+ _programLayers.enable( 0 );
|
|
|
|
+ if ( parameters.flatShading )
|
|
|
|
+ _programLayers.enable( 1 );
|
|
|
|
+ if ( parameters.logarithmicDepthBuffer )
|
|
|
|
+ _programLayers.enable( 2 );
|
|
|
|
+ if ( parameters.skinning )
|
|
|
|
+ _programLayers.enable( 3 );
|
|
|
|
+ if ( parameters.useVertexTexture )
|
|
|
|
+ _programLayers.enable( 4 );
|
|
|
|
+ if ( parameters.morphTargets )
|
|
|
|
+ _programLayers.enable( 5 );
|
|
|
|
+ if ( parameters.morphNormals )
|
|
|
|
+ _programLayers.enable( 6 );
|
|
|
|
+ if ( parameters.premultipliedAlpha )
|
|
|
|
+ _programLayers.enable( 7 );
|
|
|
|
+ if ( parameters.shadowMapEnabled )
|
|
|
|
+ _programLayers.enable( 8 );
|
|
|
|
+ if ( parameters.physicallyCorrectLights )
|
|
|
|
+ _programLayers.enable( 9 );
|
|
|
|
+ if ( parameters.doubleSided )
|
|
|
|
+ _programLayers.enable( 10 );
|
|
|
|
+ if ( parameters.flipSided )
|
|
|
|
+ _programLayers.enable( 11 );
|
|
|
|
+ if ( parameters.depthPacking )
|
|
|
|
+ _programLayers.enable( 12 );
|
|
|
|
+ if ( parameters.dithering )
|
|
|
|
+ _programLayers.enable( 13 );
|
|
|
|
+ if ( parameters.specularIntensityMap )
|
|
|
|
+ _programLayers.enable( 14 );
|
|
|
|
+ if ( parameters.specularColorMap )
|
|
|
|
+ _programLayers.enable( 15 );
|
|
|
|
+ if ( parameters.transmission )
|
|
|
|
+ _programLayers.enable( 16 );
|
|
|
|
+ if ( parameters.transmissionMap )
|
|
|
|
+ _programLayers.enable( 17 );
|
|
|
|
+ if ( parameters.thicknessMap )
|
|
|
|
+ _programLayers.enable( 18 );
|
|
|
|
+ if ( parameters.sheen )
|
|
|
|
+ _programLayers.enable( 19 );
|
|
|
|
+ if ( parameters.sheenColorMap )
|
|
|
|
+ _programLayers.enable( 20 );
|
|
|
|
+ if ( parameters.sheenRoughnessMap )
|
|
|
|
+ _programLayers.enable( 21 );
|
|
|
|
+
|
|
|
|
+ array.push( _programLayers.mask );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
function getUniforms( material ) {
|
|
function getUniforms( material ) {
|
|
|
|
|
|
const shaderID = shaderIDs[ material.type ];
|
|
const shaderID = shaderIDs[ material.type ];
|