Browse Source

WebGLRenderer: Add support for multiple uv sets and transforms. (#25721)

* WebGLRenderer: Refactor uv shaderchunks.

* GLTFLoader: Removed uv2 workaround.

* MeshGouraudMaterial: Clean up.

* Texture: Renamed uvChannel to uvSet.

* ShaderChunks: Refactored back vUv code.

* WebGLProgram: Removed uvsVertexOnly flag.

* WebGLRenderer: Added uvSet support for map and emmisiveMap.

* WebGLRenderer: Added uvSet support for lightMap and aoMap.

* Texture: Added uvSet to copy() and toJSON().

* ObjectLoader: Parse Texture uvSet.

* Examples: Fixed webgl_materials_lightmap.

* Examples: Updated webgl_lines_dashed screenshot...

* WebGLRenderer: Added support for multiple transforms.

* UniformLib: Restored uvTransform.

* WebGLRenderer: Fixed Sprites uniforms.

* WebGLRenderer: Added lightMap transform code.

* Examples: Updated webgl_loader_gltf_sheen screenshot.

* WebGLMaterials: Added refreshTransformUniform function.

* WebGLProgram: Clean up.

* OCD clean up.

* WebGLMaterials: Clean up.

* WebGLPrograms: Clean up.

* Clean up.

* WebGLMaterials: Clean up.

* ShaderLib: Clean up.

* WebGLRenderer: Added clearcoat transforms code.

* Revert "Examples: Updated webgl_lines_dashed screenshot..."

This reverts commit df778f1b24d70e091674c793fd9ddb166767fd91.

* WebGLRenderer: Added bumpMap transforms code.

* More OCD clean up.

* Clean up.

* WebGLRenderer: Added alphaMap transform code.

* Examples: Fixed webgl_materials_physical_clearcoat transform.

* Examples: Fixed webgl_lines_dashed example.

* ShaderChunk: Rename uvs_* to uv_* back.

* Manual: Replaced vUv2 references.

* Examples: Updated ProgressiveLightMap code.

* ShaderChunk: Removed vUv2.

* WebGLRenderer: Fixed normalMap and clearcoarNormalMap transforms.

* Examples: Updated webgl_nodes_loader_gltf_sheen screenshot.

* WebGLRenderer: Added displacementMap transform code.

* WebGLProgram:  Clean up.

* WebGLProgram/s: Yet more clean up.

* WebGLProgram/s and ShaderChunk: More clean up.

* WebGLProgram/s: More clean up.

* WebGLProgram: Check that there's a UV2 before trying to use it.

* WebGLPrograms: More clean up.

* WebGLProgram: Fixed normalmap crash.

* WebGLProgram/s: More clean up.

* WebGLPrograms: Clean up.

* WebGLProgram: Fixed depthPacking check.

* WebGLRenderer: Added specular*Map transform code.

* WebGLPrograms: Clean up.

* WebGLPrograms: Clean up.

* WebGLProgram: Added specular*Map to cache key.

* WebGLRenderer: Added sheen*Map transform code.

* WebGLRenderer: Added iridescence*Map transforms code.

* WebGLRenderer: Added transmissionMap and thicknessMap transform code.

* WebGLMaterials: Use mapTransform in refreshUniformsLine.

* ShaderChunks: Removed vUv and uvTransform.

* Examples: Updated advanced examples with USE_MAP and MAP_UV.

* WebGLProgram/s: Clean up.

* Docs: Added placeholder.

* GLTFLoader: Clone texture before modifying .uvSet

* Revert "ShaderChunks: Removed vUv and uvTransform."

This reverts commit 7e278a8ae01bbaf2f911ca250220336a988dc311.

* Revert "Examples: Updated advanced examples with USE_MAP and MAP_UV."

This reverts commit f9b8c7921f4cb152719692ab34df452a0646576c.

* Examples: Fixed PackedPhongMaterial.

* ShaderChunks: Leaving vUv for backwards compatibility.

* Texture: Renamed uvSet to channel.

* UniformsLib: Clean up.

* Docs: Updated offset and repeat details.

* Docs: Removed uv transforms call out from GLTFLoader.

* Docs: Added basic `channel` description.

---------

Co-authored-by: Don McCurdy <[email protected]>
mrdoob 2 years ago
parent
commit
5c5a5c74c6
56 changed files with 865 additions and 658 deletions
  1. 6 27
      docs/api/en/textures/Texture.html
  2. 5 27
      docs/api/it/textures/Texture.html
  3. 6 27
      docs/api/zh/textures/Texture.html
  4. 3 11
      docs/examples/en/loaders/GLTFLoader.html
  5. 13 19
      examples/jsm/loaders/GLTFLoader.js
  6. 0 3
      examples/jsm/materials/MeshGouraudMaterial.js
  7. 5 3
      examples/jsm/misc/ProgressiveLightMap.js
  8. 1 1
      examples/jsm/shaders/VelocityShader.js
  9. 2 4
      examples/jsm/utils/PackedPhongMaterial.js
  10. 0 0
      examples/models/json/lightmap/lightmap.json
  11. BIN
      examples/screenshots/webgl_loader_gltf_sheen.jpg
  12. BIN
      examples/screenshots/webgl_nodes_loader_gltf_sheen.jpg
  13. 0 2
      examples/webgl_gpgpu_water.html
  14. 2 0
      examples/webgl_materials_physical_clearcoat.html
  15. 1 2
      manual/en/indexed-textures.html
  16. 1 2
      manual/ja/indexed-textures.html
  17. 1 2
      manual/ko/indexed-textures.html
  18. 1 2
      manual/zh/indexed-textures.html
  19. 1 0
      src/loaders/ObjectLoader.js
  20. 0 6
      src/renderers/shaders/ShaderChunk.js
  21. 1 1
      src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js
  22. 1 1
      src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js
  23. 5 5
      src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js
  24. 2 2
      src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js
  25. 5 5
      src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js
  26. 1 1
      src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js
  27. 1 1
      src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js
  28. 1 1
      src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js
  29. 1 1
      src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js
  30. 13 13
      src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js
  31. 1 1
      src/renderers/shaders/ShaderChunk/map_fragment.glsl.js
  32. 1 1
      src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js
  33. 23 2
      src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js
  34. 4 4
      src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js
  35. 5 5
      src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js
  36. 1 1
      src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js
  37. 1 1
      src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js
  38. 2 2
      src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js
  39. 0 7
      src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js
  40. 0 10
      src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js
  41. 0 7
      src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js
  42. 108 1
      src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js
  43. 133 6
      src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js
  44. 111 1
      src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js
  45. 15 4
      src/renderers/shaders/ShaderLib.js
  46. 1 4
      src/renderers/shaders/ShaderLib/meshbasic.glsl.js
  47. 0 3
      src/renderers/shaders/ShaderLib/meshlambert.glsl.js
  48. 3 3
      src/renderers/shaders/ShaderLib/meshnormal.glsl.js
  49. 0 3
      src/renderers/shaders/ShaderLib/meshphong.glsl.js
  50. 8 11
      src/renderers/shaders/ShaderLib/meshphysical.glsl.js
  51. 0 3
      src/renderers/shaders/ShaderLib/meshtoon.glsl.js
  52. 25 15
      src/renderers/shaders/UniformsLib.js
  53. 93 238
      src/renderers/webgl/WebGLMaterials.js
  54. 56 26
      src/renderers/webgl/WebGLProgram.js
  55. 192 130
      src/renderers/webgl/WebGLPrograms.js
  56. 3 0
      src/textures/Texture.js

+ 6 - 27
docs/api/en/textures/Texture.html

@@ -77,6 +77,11 @@
 		See the [page:Textures texture constants] page for other mapping types.
 		</p>
 
+		<h3>[property:Integer channel]</h3>
+		<p>
+		Lets you select the uv attribute to map the texture to. `0` for `uv` and `1` for `uv2`.
+		</p>
+
 		<h3>[property:number wrapS]</h3>
 		<p>
 		This defines how the texture is wrapped horizontally and corresponds to *U* in UV mapping.<br />
@@ -151,39 +156,13 @@
 		How much a single repetition of the texture is offset from the beginning, in each direction U and V.
 		Typical range is `0.0` to `1.0`.
 		</p>
-		<p>
-			The below texture types share the `first` uv channel in the engine. The offset (and repeat) setting is evaluated according to
-			the following priorities and then shared by those textures:
-			<ol>
-				<li>color map</li>
-				<li>specular map</li>
-				<li>displacement map</li>
-				<li>normal map</li>
-				<li>bump map</li>
-				<li>roughness map</li>
-				<li>metalness map</li>
-				<li>alpha map</li>
-				<li>emissive map</li>
-				<li>clearcoat map</li>
-				<li>clearcoat normal map</li>
-				<li>clearcoat roughnessMap map</li>
-			</ol>
-		</p>
-		<p>
-			The below texture types share the `second` uv channel in the engine. The offset (and repeat) setting is evaluated according to
-			the following priorities and then shared by those textures:
-			<ol>
-				<li>ao map</li>
-				<li>light map</li>
-			</ol>
-		</p>
 
 		<h3>[property:Vector2 repeat]</h3>
 		<p>
 		How many times the texture is repeated across the surface, in each direction U and V.  If repeat is set
 		greater than 1 in either direction, the corresponding Wrap parameter should also be set to
 		[page:Textures THREE.RepeatWrapping] or [page:Textures THREE.MirroredRepeatWrapping] to achieve the desired
-		tiling effect. Setting different repeat values for textures is restricted in the same way like [page:.offset].
+		tiling effect.
 		</p>
 
 		<h3>[property:number rotation]</h3>

+ 5 - 27
docs/api/it/textures/Texture.html

@@ -79,6 +79,11 @@
 			Vedi la pagina [page:Textures texture constants] per altri tipi di mapping.
 		</p>
 
+		<h3>[property:Integer channel]</h3>
+		<p>
+			Lets you select the uv attribute to map the texture to. `0` for `uv` and `1` for `uv2`.
+		</p>
+
 		<h3>[property:number wrapS]</h3>
 		<p>
 			Questo definisce come la texture è wrappata orizzontalmente e corrisponde a *U* nel mapping UV.<br />
@@ -152,32 +157,6 @@
 			Di quanto una singola ripetizione della texture è sfalsata dall'inizio, in ciascuna direzione U e V.
 			L'intervallo tipico è compreso tra `0.0` e `1.0`.
 		</p>
-		<p>
-			I tipi di texture seguenti condividono il `primo` canale uv nel motore. L'impostazione dell'offset (e della ripetizione) viene valutata
-			in base alle seguenti priorità e quindi condivisa da tali texture:
-			<ol>
-				<li>color map</li>
-				<li>specular map</li>
-				<li>displacement map</li>
-				<li>normal map</li>
-				<li>bump map</li>
-				<li>roughness map</li>
-				<li>metalness map</li>
-				<li>alpha map</li>
-				<li>emissive map</li>
-				<li>clearcoat map</li>
-				<li>clearcoat normal map</li>
-				<li>clearcoat roughnessMap map</li>
-			</ol>
-		</p>
-		<p>
-			I tipi di texture seguenti condividono il `secondo` canale uv nel motore. L'impostazione dell'offset (e della ripetizione) viene valutata
-			in base alle seguenti priorità e quindi condivisa da tali texture:
-			<ol>
-				<li>ao map</li>
-				<li>light map</li>
-			</ol>
-		</p>
 
 		<h3>[property:Vector2 repeat]</h3>
 		<p>
@@ -185,7 +164,6 @@
 			impostata su un valore maggiore di 1 in entrambe le direzioni, anche il parametro Wrap corrispondente
 			deve essere impostato su [page:Textures THREE.RepeatWrapping] o [page:Textures THREE.MirroredRepeatWrapping] per ottenere l'effetto
 			di piastrellatura desiderato.
-			L'impostazione di diversi valori di ripetizione per le texture è limitata allo stesso modo di [page:.offset].
 		</p>
 
 		<h3>[property:number rotation]</h3>

+ 6 - 27
docs/api/zh/textures/Texture.html

@@ -71,6 +71,11 @@
 		请参阅[page:Textures texture constants](映射模式常量)来了解其他映射类型。
 		</p>
 
+		<h3>[property:Integer channel]</h3>
+		<p>
+		Lets you select the uv attribute to map the texture to. `0` for `uv` and `1` for `uv2`.
+		</p>
+
 		<h3>[property:number wrapS]</h3>
 		<p>
 		这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于*U*。<br />
@@ -141,38 +146,12 @@
 		贴图单次重复中的起始偏移量,分别表示U和V。
 		一般范围是由`0.0`到`1.0`。
 		</p>
-		<p>
-			在此引擎中下列纹理共享`第一套`uv通道。
-			偏移量(以及重复次数)的设置项按照下列纹理进行优先级排列并共享:
-			<ol>
-				<li>color map</li>
-				<li>specular map</li>
-				<li>displacement map</li>
-				<li>normal map</li>
-				<li>bump map</li>
-				<li>roughness map</li>
-				<li>metalness map</li>
-				<li>alpha map</li>
-				<li>emissive map</li>
-				<li>clearcoat map</li>
-				<li>clearcoat normal map</li>
-				<li>clearcoat roughnessMap map</li>
-			</ol>
-		</p>
-		<p>
-			在此引擎中下列纹理类型共享`第二套`uv通道。
-			偏移量(以及重复次数)的设置项按照下列纹理进行优先级排列并共享:
-			<ol>
-				<li>ao map</li>
-				<li>light map</li>
-			</ol>
-		</p>
 
 		<h3>[property:Vector2 repeat]</h3>
 		<p>
 		决定纹理在表面的重复次数,两个方向分别表示U和V,如果重复次数在任何方向上设置了超过1的数值,
 		对应的Wrap需要设置为[page:Textures THREE.RepeatWrapping]或者[page:Textures THREE.MirroredRepeatWrapping]来
-		达到想要的平铺效果。此项设置有和[page:.offset]一样的限制。
+		达到想要的平铺效果。
 		</p>
 
 		<h3>[property:number rotation]</h3>

+ 3 - 11
docs/examples/en/loaders/GLTFLoader.html

@@ -55,7 +55,7 @@
 			<li>KHR_mesh_quantization</li>
 			<li>KHR_lights_punctual<sup>1</sup></li>
 			<li>KHR_texture_basisu</li>
-			<li>KHR_texture_transform<sup>2</sup></li>
+			<li>KHR_texture_transform</li>
 			<li>EXT_texture_webp</li>
 			<li>EXT_meshopt_compression</li>
 			<li>EXT_mesh_gpu_instancing</li>
@@ -66,24 +66,16 @@
 		</p>
 
 		<ul>
-			<li>[link:https://github.com/takahirox/three-gltf-extensions KHR_materials_variants]<sup>3</sup></li>
+			<li>[link:https://github.com/takahirox/three-gltf-extensions KHR_materials_variants]<sup>2</sup></li>
 			<li>[link:https://github.com/takahirox/three-gltf-extensions MSFT_texture_dds]</li>
 		</ul>
 
 		<p><i>
 			<sup>1</sup>Requires [link:https://threejs.org/docs/#api/en/renderers/WebGLRenderer.physicallyCorrectLights physicallyCorrectLights] to be enabled.
 		</i></p>
-		<p><i>
-			<sup>2</sup>UV transforms are supported, with several key limitations. Transforms applied to
-			a texture using the first UV slot (all textures except aoMap and lightMap) must share the same
-			transform, or no transform at all. The aoMap and lightMap textures cannot be transformed. No
-			more than one transform may be used per material. See
-			#[link:https://github.com/mrdoob/three.js/pull/13831 13831] and
-			#[link:https://github.com/mrdoob/three.js/issues/12788 12788].
-		</i></p>
 
 		<p><i>
-			<sup>3</sup>You can also manually process the extension after loading in your application. See [link:https://threejs.org/examples/#webgl_loader_gltf_variants Three.js glTF materials variants example].
+			<sup>2</sup>You can also manually process the extension after loading in your application. See [link:https://threejs.org/examples/#webgl_loader_gltf_variants Three.js glTF materials variants example].
 		</i></p>
 
 		<h2>Code Example</h2>

+ 13 - 19
examples/jsm/loaders/GLTFLoader.js

@@ -1812,13 +1812,10 @@ class GLTFTextureTransformExtension {
 
 	extendTexture( texture, transform ) {
 
-		if ( transform.texCoord !== undefined ) {
-
-			console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' );
-
-		}
-
-		if ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) {
+		if ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )
+			&& transform.offset === undefined
+			&& transform.rotation === undefined
+			&& transform.scale === undefined ) {
 
 			// See https://github.com/mrdoob/three.js/issues/21819.
 			return texture;
@@ -1827,6 +1824,12 @@ class GLTFTextureTransformExtension {
 
 		texture = texture.clone();
 
+		if ( transform.texCoord !== undefined ) {
+
+			texture.channel = transform.texCoord;
+
+		}
+
 		if ( transform.offset !== undefined ) {
 
 			texture.offset.fromArray( transform.offset );
@@ -3122,11 +3125,10 @@ class GLTFParser {
 
 			if ( ! texture ) return null;
 
-			// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured
-			// However, we will copy UV set 0 to UV set 1 on demand for aoMap
-			if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {
+			if ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {
 
-				console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );
+				texture = texture.clone();
+				texture.channel = mapDef.texCoord;
 
 			}
 
@@ -3252,14 +3254,6 @@ class GLTFParser {
 
 		}
 
-		// workarounds for mesh and geometry
-
-		if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {
-
-			geometry.setAttribute( 'uv2', geometry.attributes.uv );
-
-		}
-
 		mesh.material = material;
 
 	}

+ 0 - 3
examples/jsm/materials/MeshGouraudMaterial.js

@@ -37,7 +37,6 @@ const GouraudShader = {
 
 		#include <common>
 		#include <uv_pars_vertex>
-		#include <uv2_pars_vertex>
 		#include <envmap_pars_vertex>
 		#include <bsdfs>
 		#include <lights_pars_begin>
@@ -52,7 +51,6 @@ const GouraudShader = {
 		void main() {
 
 			#include <uv_vertex>
-			#include <uv2_vertex>
 			#include <color_vertex>
 			#include <morphcolor_vertex>
 
@@ -221,7 +219,6 @@ const GouraudShader = {
 		#include <dithering_pars_fragment>
 		#include <color_pars_fragment>
 		#include <uv_pars_fragment>
-		#include <uv2_pars_fragment>
 		#include <map_pars_fragment>
 		#include <alphamap_pars_fragment>
 		#include <alphatest_pars_fragment>

+ 5 - 3
examples/jsm/misc/ProgressiveLightMap.js

@@ -36,6 +36,7 @@ class ProgressiveLightMap {
 		const format = /(Android|iPad|iPhone|iPod)/g.test( navigator.userAgent ) ? THREE.HalfFloatType : THREE.FloatType;
 		this.progressiveLightMap1 = new THREE.WebGLRenderTarget( this.res, this.res, { type: format } );
 		this.progressiveLightMap2 = new THREE.WebGLRenderTarget( this.res, this.res, { type: format } );
+		this.progressiveLightMap2.texture.channel = 1;
 
 		// Inject some spicy new logic into a standard phong material
 		this.uvMat = new THREE.MeshPhongMaterial();
@@ -45,17 +46,18 @@ class ProgressiveLightMap {
 			// Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions
 			shader.vertexShader =
 				'#define USE_LIGHTMAP\n' +
+				'#define LIGHTMAP_UV uv2\n' +
 				shader.vertexShader.slice( 0, - 1 ) +
-				'	gl_Position = vec4((uv2 - 0.5) * 2.0, 1.0, 1.0); }';
+				'	gl_Position = vec4((LIGHTMAP_UV - 0.5) * 2.0, 1.0, 1.0); }';
 
 			// Fragment Shader: Set Pixels to average in the Previous frame's Shadows
 			const bodyStart = shader.fragmentShader.indexOf( 'void main() {' );
 			shader.fragmentShader =
-				'varying vec2 vUv2;\n' +
+				'#define USE_LIGHTMAP\n' +
 				shader.fragmentShader.slice( 0, bodyStart ) +
 				'	uniform sampler2D previousShadowMap;\n	uniform float averagingWindow;\n' +
 				shader.fragmentShader.slice( bodyStart - 1, - 1 ) +
-				`\nvec3 texelOld = texture2D(previousShadowMap, vUv2).rgb;
+				`\nvec3 texelOld = texture2D(previousShadowMap, vLightMapUv).rgb;
 				gl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, 1.0/averagingWindow);
 			}`;
 

+ 1 - 1
examples/jsm/shaders/VelocityShader.js

@@ -23,7 +23,7 @@ const VelocityShader = {
 	vertexShader: /* glsl */`
 #define NORMAL
 
-#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )
 
 	varying vec3 vViewPosition;
 

+ 2 - 4
examples/jsm/utils/PackedPhongMaterial.js

@@ -37,7 +37,6 @@ class PackedPhongMaterial extends MeshPhongMaterial {
 
 			ShaderChunk.common,
 			ShaderChunk.uv_pars_vertex,
-			ShaderChunk.uv2_pars_vertex,
 			ShaderChunk.displacementmap_pars_vertex,
 			ShaderChunk.envmap_pars_vertex,
 			ShaderChunk.color_pars_vertex,
@@ -116,13 +115,12 @@ class PackedPhongMaterial extends MeshPhongMaterial {
 
 			ShaderChunk.uv_vertex,
 
-			`#ifdef USE_UV
+			`#ifdef USE_MAP
 					#ifdef USE_PACKED_UV
-						vUv = decodeUV(vUv);
+						vMapUv = decodeUV(vMapUv);
 					#endif
 				#endif`,
 
-			ShaderChunk.uv2_vertex,
 			ShaderChunk.color_vertex,
 			ShaderChunk.morphcolor_vertex,
 

File diff suppressed because it is too large
+ 0 - 0
examples/models/json/lightmap/lightmap.json


BIN
examples/screenshots/webgl_loader_gltf_sheen.jpg


BIN
examples/screenshots/webgl_nodes_loader_gltf_sheen.jpg


+ 0 - 2
examples/webgl_gpgpu_water.html

@@ -187,7 +187,6 @@
 
 			#include <common>
 			#include <uv_pars_vertex>
-			#include <uv2_pars_vertex>
 			#include <displacementmap_pars_vertex>
 			#include <envmap_pars_vertex>
 			#include <color_pars_vertex>
@@ -202,7 +201,6 @@
 				vec2 cellSize = vec2( 1.0 / WIDTH, 1.0 / WIDTH );
 
 				#include <uv_vertex>
-				#include <uv2_vertex>
 				#include <color_vertex>
 
 				// # include <beginnormal_vertex>

+ 2 - 0
examples/webgl_materials_physical_clearcoat.html

@@ -77,6 +77,8 @@
 							const normalMap = textureLoader.load( 'textures/carbon/Carbon_Normal.png' );
 							normalMap.wrapS = THREE.RepeatWrapping;
 							normalMap.wrapT = THREE.RepeatWrapping;
+							normalMap.repeat.x = 10;
+							normalMap.repeat.y = 10;
 
 							const normalMap2 = textureLoader.load( 'textures/water/Water_1_M_Normal.jpg' );
 

+ 1 - 2
manual/en/indexed-textures.html

@@ -294,7 +294,6 @@ we can modify the default shaders by adding a function to a material's
 <pre class="prettyprint showlinemods notranslate lang-glsl" translate="no">#include &lt;common&gt;
 #include &lt;color_pars_fragment&gt;
 #include &lt;uv_pars_fragment&gt;
-#include &lt;uv2_pars_fragment&gt;
 #include &lt;map_pars_fragment&gt;
 #include &lt;alphamap_pars_fragment&gt;
 #include &lt;aomap_pars_fragment&gt;
@@ -315,7 +314,7 @@ void main() {
     #include &lt;specularmap_fragment&gt;
     ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
     #ifdef USE_LIGHTMAP
-        reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
+        reflectedLight.indirectDiffuse += texture2D( lightMap, vLightMapUv ).xyz * lightMapIntensity;
     #else
         reflectedLight.indirectDiffuse += vec3( 1.0 );
     #endif

+ 1 - 2
manual/ja/indexed-textures.html

@@ -274,7 +274,6 @@ three.jsでデフォルトのシェーダーを変更してみましょう。
 <pre class="prettyprint showlinemods notranslate lang-glsl" translate="no">#include &lt;common&gt;
 #include &lt;color_pars_fragment&gt;
 #include &lt;uv_pars_fragment&gt;
-#include &lt;uv2_pars_fragment&gt;
 #include &lt;map_pars_fragment&gt;
 #include &lt;alphamap_pars_fragment&gt;
 #include &lt;aomap_pars_fragment&gt;
@@ -295,7 +294,7 @@ void main() {
     #include &lt;specularmap_fragment&gt;
     ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
     #ifdef USE_LIGHTMAP
-        reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
+        reflectedLight.indirectDiffuse += texture2D( lightMap, vLightMapUv ).xyz * lightMapIntensity;
     #else
         reflectedLight.indirectDiffuse += vec3( 1.0 );
     #endif

+ 1 - 2
manual/ko/indexed-textures.html

@@ -241,7 +241,6 @@ const palette = [
 <pre class="prettyprint showlinemods notranslate lang-glsl" translate="no">#include &lt;common&gt;
 #include &lt;color_pars_fragment&gt;
 #include &lt;uv_pars_fragment&gt;
-#include &lt;uv2_pars_fragment&gt;
 #include &lt;map_pars_fragment&gt;
 #include &lt;alphamap_pars_fragment&gt;
 #include &lt;aomap_pars_fragment&gt;
@@ -262,7 +261,7 @@ void main() {
     #include &lt;specularmap_fragment&gt;
     ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
     #ifdef USE_LIGHTMAP
-        reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
+        reflectedLight.indirectDiffuse += texture2D( lightMap, vLightMapUv ).xyz * lightMapIntensity;
     #else
         reflectedLight.indirectDiffuse += vec3( 1.0 );
     #endif

+ 1 - 2
manual/zh/indexed-textures.html

@@ -265,7 +265,6 @@ const palette = [
         <pre class="prettyprint showlinemods notranslate lang-glsl" translate="no">#include &lt;common&gt;
 #include &lt;color_pars_fragment&gt;
 #include &lt;uv_pars_fragment&gt;
-#include &lt;uv2_pars_fragment&gt;
 #include &lt;map_pars_fragment&gt;
 #include &lt;alphamap_pars_fragment&gt;
 #include &lt;aomap_pars_fragment&gt;
@@ -286,7 +285,7 @@ void main() {
     #include &lt;specularmap_fragment&gt;
     ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
     #ifdef USE_LIGHTMAP
-        reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
+        reflectedLight.indirectDiffuse += texture2D( lightMap, vLightMapUv ).xyz * lightMapIntensity;
     #else
         reflectedLight.indirectDiffuse += vec3( 1.0 );
     #endif

+ 1 - 0
src/loaders/ObjectLoader.js

@@ -638,6 +638,7 @@ class ObjectLoader extends Loader {
 				if ( data.name !== undefined ) texture.name = data.name;
 
 				if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
+				if ( data.channel !== undefined ) texture.channel = data.channel;
 
 				if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
 				if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );

+ 0 - 6
src/renderers/shaders/ShaderChunk.js

@@ -100,9 +100,6 @@ import transmission_pars_fragment from './ShaderChunk/transmission_pars_fragment
 import uv_pars_fragment from './ShaderChunk/uv_pars_fragment.glsl.js';
 import uv_pars_vertex from './ShaderChunk/uv_pars_vertex.glsl.js';
 import uv_vertex from './ShaderChunk/uv_vertex.glsl.js';
-import uv2_pars_fragment from './ShaderChunk/uv2_pars_fragment.glsl.js';
-import uv2_pars_vertex from './ShaderChunk/uv2_pars_vertex.glsl.js';
-import uv2_vertex from './ShaderChunk/uv2_vertex.glsl.js';
 import worldpos_vertex from './ShaderChunk/worldpos_vertex.glsl.js';
 
 import * as background from './ShaderLib/background.glsl.js';
@@ -226,9 +223,6 @@ export const ShaderChunk = {
 	uv_pars_fragment: uv_pars_fragment,
 	uv_pars_vertex: uv_pars_vertex,
 	uv_vertex: uv_vertex,
-	uv2_pars_fragment: uv2_pars_fragment,
-	uv2_pars_vertex: uv2_pars_vertex,
-	uv2_vertex: uv2_vertex,
 	worldpos_vertex: worldpos_vertex,
 
 	background_vert: background.vertex,

+ 1 - 1
src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js

@@ -1,7 +1,7 @@
 export default /* glsl */`
 #ifdef USE_ALPHAMAP
 
-	diffuseColor.a *= texture2D( alphaMap, vUv ).g;
+	diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;
 
 #endif
 `;

+ 1 - 1
src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js

@@ -2,7 +2,7 @@ export default /* glsl */`
 #ifdef USE_AOMAP
 
 	// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture
-	float ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;
+	float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;
 
 	reflectedLight.indirectDiffuse *= ambientOcclusion;
 

+ 5 - 5
src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js

@@ -11,12 +11,12 @@ export default /* glsl */`
 
 	vec2 dHdxy_fwd() {
 
-		vec2 dSTdx = dFdx( vUv );
-		vec2 dSTdy = dFdy( vUv );
+		vec2 dSTdx = dFdx( vBumpMapUv );
+		vec2 dSTdy = dFdy( vBumpMapUv );
 
-		float Hll = bumpScale * texture2D( bumpMap, vUv ).x;
-		float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;
-		float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;
+		float Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;
+		float dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;
+		float dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;
 
 		return vec2( dBx, dBy );
 

+ 2 - 2
src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js

@@ -1,10 +1,10 @@
 export default /* glsl */`
 #ifdef USE_CLEARCOAT_NORMALMAP
 
-	vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;
+	vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;
 	clearcoatMapN.xy *= clearcoatNormalScale;
 
-	clearcoatNormal = normalize( tbn * clearcoatMapN );
+	clearcoatNormal = normalize( tbn2 * clearcoatMapN );
 
 #endif
 `;

+ 5 - 5
src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js

@@ -6,16 +6,16 @@ export default /* glsl */`
 
 #endif
 
-#ifdef USE_CLEARCOAT_ROUGHNESSMAP
+#ifdef USE_CLEARCOAT_NORMALMAP
 
-	uniform sampler2D clearcoatRoughnessMap;
+	uniform sampler2D clearcoatNormalMap;
+	uniform vec2 clearcoatNormalScale;
 
 #endif
 
-#ifdef USE_CLEARCOAT_NORMALMAP
+#ifdef USE_CLEARCOAT_ROUGHNESSMAP
 
-	uniform sampler2D clearcoatNormalMap;
-	uniform vec2 clearcoatNormalScale;
+	uniform sampler2D clearcoatRoughnessMap;
 
 #endif
 `;

+ 1 - 1
src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js

@@ -1,7 +1,7 @@
 export default /* glsl */`
 #ifdef USE_DISPLACEMENTMAP
 
-	transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );
+	transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );
 
 #endif
 `;

+ 1 - 1
src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js

@@ -1,7 +1,7 @@
 export default /* glsl */`
 #ifdef USE_EMISSIVEMAP
 
-	vec4 emissiveColor = texture2D( emissiveMap, vUv );
+	vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );
 
 	totalEmissiveRadiance *= emissiveColor.rgb;
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js

@@ -1,7 +1,7 @@
 export default /* glsl */`
 #ifdef USE_LIGHTMAP
 
-	vec4 lightMapTexel = texture2D( lightMap, vUv2 );
+	vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );
 	vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;
 
 	reflectedLight.indirectDiffuse += lightMapIrradiance;

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js

@@ -3,7 +3,7 @@ export default /* glsl */`
 
 	#ifdef USE_LIGHTMAP
 
-		vec4 lightMapTexel = texture2D( lightMap, vUv2 );
+		vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );
 		vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;
 
 		irradiance += lightMapIrradiance;

+ 13 - 13
src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js

@@ -13,20 +13,20 @@ material.roughness = min( material.roughness, 1.0 );
 
 	material.ior = ior;
 
-	#ifdef SPECULAR
+	#ifdef USE_SPECULAR
 
 		float specularIntensityFactor = specularIntensity;
 		vec3 specularColorFactor = specularColor;
 
-		#ifdef USE_SPECULARINTENSITYMAP
+		#ifdef USE_SPECULAR_COLORMAP
 
-			specularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;
+			specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;
 
 		#endif
 
-		#ifdef USE_SPECULARCOLORMAP
+		#ifdef USE_SPECULAR_INTENSITYMAP
 
-			specularColorFactor *= texture2D( specularColorMap, vUv ).rgb;
+			specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;
 
 		#endif
 
@@ -58,13 +58,13 @@ material.roughness = min( material.roughness, 1.0 );
 
 	#ifdef USE_CLEARCOATMAP
 
-		material.clearcoat *= texture2D( clearcoatMap, vUv ).x;
+		material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;
 
 	#endif
 
 	#ifdef USE_CLEARCOAT_ROUGHNESSMAP
 
-		material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;
+		material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;
 
 	#endif
 
@@ -82,13 +82,13 @@ material.roughness = min( material.roughness, 1.0 );
 
 	#ifdef USE_IRIDESCENCEMAP
 
-		material.iridescence *= texture2D( iridescenceMap, vUv ).r;
+		material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;
 
 	#endif
 
 	#ifdef USE_IRIDESCENCE_THICKNESSMAP
 
-		material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;
+		material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;
 
 	#else
 
@@ -102,17 +102,17 @@ material.roughness = min( material.roughness, 1.0 );
 
 	material.sheenColor = sheenColor;
 
-	#ifdef USE_SHEENCOLORMAP
+	#ifdef USE_SHEEN_COLORMAP
 
-		material.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;
+		material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;
 
 	#endif
 
 	material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );
 
-	#ifdef USE_SHEENROUGHNESSMAP
+	#ifdef USE_SHEEN_ROUGHNESSMAP
 
-		material.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;
+		material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;
 
 	#endif
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/map_fragment.glsl.js

@@ -1,7 +1,7 @@
 export default /* glsl */`
 #ifdef USE_MAP
 
-	vec4 sampledDiffuseColor = texture2D( map, vUv );
+	vec4 sampledDiffuseColor = texture2D( map, vMapUv );
 
 	#ifdef DECODE_VIDEO_TEXTURE
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js

@@ -3,7 +3,7 @@ float metalnessFactor = metalness;
 
 #ifdef USE_METALNESSMAP
 
-	vec4 texelMetalness = texture2D( metalnessMap, vUv );
+	vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );
 
 	// reads channel B, compatible with a combined OcclusionRoughnessMetallic (RGB) texture
 	metalnessFactor *= texelMetalness.b;

+ 23 - 2
src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js

@@ -19,7 +19,7 @@ float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;
 
 #endif
 
-#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )
+#ifdef USE_NORMALMAP_TANGENTSPACE
 
 	#ifdef USE_TANGENT
 
@@ -27,7 +27,7 @@ float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;
 
 	#else
 
-		mat3 tbn = getTangentFrame( - vViewPosition, normal );
+		mat3 tbn = getTangentFrame( - vViewPosition, normal, vNormalMapUv );
 
 	#endif
 
@@ -40,6 +40,27 @@ float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;
 
 #endif
 
+#ifdef USE_CLEARCOAT_NORMALMAP
+
+	#ifdef USE_TANGENT
+
+		mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );
+
+	#else
+
+		mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );
+
+	#endif
+
+	#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )
+
+		tbn2[0] *= faceDirection;
+		tbn2[1] *= faceDirection;
+
+	#endif
+
+#endif
+
 // non perturbed normal for clearcoat among others
 
 vec3 geometryNormal = normal;

+ 4 - 4
src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js

@@ -1,8 +1,8 @@
 export default /* glsl */`
 
-#ifdef OBJECTSPACE_NORMALMAP
+#ifdef USE_NORMALMAP_OBJECTSPACE
 
-	normal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals
+	normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; // overrides both flatShading and attribute normals
 
 	#ifdef FLIP_SIDED
 
@@ -18,9 +18,9 @@ export default /* glsl */`
 
 	normal = normalize( normalMatrix * normal );
 
-#elif defined( TANGENTSPACE_NORMALMAP )
+#elif defined( USE_NORMALMAP_TANGENTSPACE )
 
-	vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;
+	vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
 	mapN.xy *= normalScale;
 
 	normal = normalize( tbn * mapN );

+ 5 - 5
src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js

@@ -6,23 +6,23 @@ export default /* glsl */`
 
 #endif
 
-#ifdef OBJECTSPACE_NORMALMAP
+#ifdef USE_NORMALMAP_OBJECTSPACE
 
 	uniform mat3 normalMatrix;
 
 #endif
 
-#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )
+#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) )
 
 	// Normal Mapping Without Precomputed Tangents
 	// http://www.thetenthplanet.de/archives/1180
 
-	mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm ) {
+	mat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {
 
 		vec3 q0 = dFdx( eye_pos.xyz );
 		vec3 q1 = dFdy( eye_pos.xyz );
-		vec2 st0 = dFdx( vUv.st );
-		vec2 st1 = dFdy( vUv.st );
+		vec2 st0 = dFdx( uv.st );
+		vec2 st1 = dFdy( uv.st );
 
 		vec3 N = surf_norm; // normalized
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js

@@ -3,7 +3,7 @@ float roughnessFactor = roughness;
 
 #ifdef USE_ROUGHNESSMAP
 
-	vec4 texelRoughness = texture2D( roughnessMap, vUv );
+	vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );
 
 	// reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture
 	roughnessFactor *= texelRoughness.g;

+ 1 - 1
src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js

@@ -3,7 +3,7 @@ float specularStrength;
 
 #ifdef USE_SPECULARMAP
 
-	vec4 texelSpecular = texture2D( specularMap, vUv );
+	vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );
 	specularStrength = texelSpecular.r;
 
 #else

+ 2 - 2
src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js

@@ -9,13 +9,13 @@ export default /* glsl */`
 
 	#ifdef USE_TRANSMISSIONMAP
 
-		material.transmission *= texture2D( transmissionMap, vUv ).r;
+		material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;
 
 	#endif
 
 	#ifdef USE_THICKNESSMAP
 
-		material.thickness *= texture2D( thicknessMap, vUv ).g;
+		material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;
 
 	#endif
 

+ 0 - 7
src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js

@@ -1,7 +0,0 @@
-export default /* glsl */`
-#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
-
-	varying vec2 vUv2;
-
-#endif
-`;

+ 0 - 10
src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js

@@ -1,10 +0,0 @@
-export default /* glsl */`
-#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
-
-	attribute vec2 uv2;
-	varying vec2 vUv2;
-
-	uniform mat3 uv2Transform;
-
-#endif
-`;

+ 0 - 7
src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js

@@ -1,7 +0,0 @@
-export default /* glsl */`
-#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
-
-	vUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;
-
-#endif
-`;

+ 108 - 1
src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js

@@ -1,7 +1,114 @@
 export default /* glsl */`
-#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )
+#ifdef USE_UV
 
 	varying vec2 vUv;
 
+#endif
+#ifdef USE_MAP
+
+	varying vec2 vMapUv;
+
+#endif
+#ifdef USE_ALPHAMAP
+
+	varying vec2 vAlphaMapUv;
+
+#endif
+#ifdef USE_LIGHTMAP
+
+	varying vec2 vLightMapUv;
+
+#endif
+#ifdef USE_AOMAP
+
+	varying vec2 vAoMapUv;
+
+#endif
+#ifdef USE_BUMPMAP
+
+	varying vec2 vBumpMapUv;
+
+#endif
+#ifdef USE_NORMALMAP
+
+	varying vec2 vNormalMapUv;
+
+#endif
+#ifdef USE_EMISSIVEMAP
+
+	varying vec2 vEmissiveMapUv;
+
+#endif
+#ifdef USE_METALNESSMAP
+
+	varying vec2 vMetalnessMapUv;
+
+#endif
+#ifdef USE_ROUGHNESSMAP
+
+	varying vec2 vRoughnessMapUv;
+
+#endif
+#ifdef USE_CLEARCOATMAP
+
+	varying vec2 vClearcoatMapUv;
+
+#endif
+#ifdef USE_CLEARCOAT_NORMALMAP
+
+	varying vec2 vClearcoatNormalMapUv;
+
+#endif
+#ifdef USE_CLEARCOAT_ROUGHNESSMAP
+
+	varying vec2 vClearcoatRoughnessMapUv;
+
+#endif
+#ifdef USE_IRIDESCENCEMAP
+
+	varying vec2 vIridescenceMapUv;
+
+#endif
+#ifdef USE_IRIDESCENCE_THICKNESSMAP
+
+	varying vec2 vIridescenceThicknessMapUv;
+
+#endif
+#ifdef USE_SHEEN_COLORMAP
+
+	varying vec2 vSheenColorMapUv;
+
+#endif
+#ifdef USE_SHEEN_ROUGHNESSMAP
+
+	varying vec2 vSheenRoughnessMapUv;
+
+#endif
+#ifdef USE_SPECULARMAP
+
+	varying vec2 vSpecularMapUv;
+
+#endif
+#ifdef USE_SPECULAR_COLORMAP
+
+	varying vec2 vSpecularColorMapUv;
+
+#endif
+#ifdef USE_SPECULAR_INTENSITYMAP
+
+	varying vec2 vSpecularIntensityMapUv;
+
+#endif
+#ifdef USE_TRANSMISSIONMAP
+
+	uniform mat3 transmissionMapTransform;
+	varying vec2 vTransmissionMapUv;
+
+#endif
+#ifdef USE_THICKNESSMAP
+
+	uniform mat3 thicknessMapTransform;
+	varying vec2 vThicknessMapUv;
+
 #endif
 `;

+ 133 - 6
src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js

@@ -1,17 +1,144 @@
 export default /* glsl */`
 #ifdef USE_UV
 
-	#ifdef UVS_VERTEX_ONLY
+	varying vec2 vUv;
 
-		vec2 vUv;
+#endif
+#ifdef USE_UV2
+
+	attribute vec2 uv2;
+
+#endif
+#ifdef USE_MAP
+
+	uniform mat3 mapTransform;
+	varying vec2 vMapUv;
+
+#endif
+#ifdef USE_ALPHAMAP
+
+	uniform mat3 alphaMapTransform;
+	varying vec2 vAlphaMapUv;
+
+#endif
+#ifdef USE_LIGHTMAP
+
+	uniform mat3 lightMapTransform;
+	varying vec2 vLightMapUv;
+
+#endif
+#ifdef USE_AOMAP
+
+	uniform mat3 aoMapTransform;
+	varying vec2 vAoMapUv;
+
+#endif
+#ifdef USE_BUMPMAP
+
+	uniform mat3 bumpMapTransform;
+	varying vec2 vBumpMapUv;
+
+#endif
+#ifdef USE_NORMALMAP
+
+	uniform mat3 normalMapTransform;
+	varying vec2 vNormalMapUv;
+
+#endif
+#ifdef USE_DISPLACEMENTMAP
+
+	uniform mat3 displacementMapTransform;
+	varying vec2 vDisplacementMapUv;
+
+#endif
+#ifdef USE_EMISSIVEMAP
+
+	uniform mat3 emissiveMapTransform;
+	varying vec2 vEmissiveMapUv;
+
+#endif
+#ifdef USE_METALNESSMAP
+
+	uniform mat3 metalnessMapTransform;
+	varying vec2 vMetalnessMapUv;
+
+#endif
+#ifdef USE_ROUGHNESSMAP
+
+	uniform mat3 roughnessMapTransform;
+	varying vec2 vRoughnessMapUv;
 
-	#else
+#endif
+#ifdef USE_CLEARCOATMAP
+
+	uniform mat3 clearcoatMapTransform;
+	varying vec2 vClearcoatMapUv;
+
+#endif
+#ifdef USE_CLEARCOAT_NORMALMAP
+
+	uniform mat3 clearcoatNormalMapTransform;
+	varying vec2 vClearcoatNormalMapUv;
+
+#endif
+#ifdef USE_CLEARCOAT_ROUGHNESSMAP
+
+	uniform mat3 clearcoatRoughnessMapTransform;
+	varying vec2 vClearcoatRoughnessMapUv;
+
+#endif
+#ifdef USE_SHEEN_COLORMAP
+
+	uniform mat3 sheenColorMapTransform;
+	varying vec2 vSheenColorMapUv;
+
+#endif
+#ifdef USE_SHEEN_ROUGHNESSMAP
+
+	uniform mat3 sheenRoughnessMapTransform;
+	varying vec2 vSheenRoughnessMapUv;
+
+#endif
+#ifdef USE_IRIDESCENCEMAP
 
-		varying vec2 vUv;
+	uniform mat3 iridescenceMapTransform;
+	varying vec2 vIridescenceMapUv;
 
-	#endif
+#endif
+#ifdef USE_IRIDESCENCE_THICKNESSMAP
+
+	uniform mat3 iridescenceThicknessMapTransform;
+	varying vec2 vIridescenceThicknessMapUv;
+
+#endif
+#ifdef USE_SPECULARMAP
+
+	uniform mat3 specularMapTransform;
+	varying vec2 vSpecularMapUv;
+
+#endif
+#ifdef USE_SPECULAR_COLORMAP
+
+	uniform mat3 specularColorMapTransform;
+	varying vec2 vSpecularColorMapUv;
+
+#endif
+#ifdef USE_SPECULAR_INTENSITYMAP
+
+	uniform mat3 specularIntensityMapTransform;
+	varying vec2 vSpecularIntensityMapUv;
+
+#endif
+#ifdef USE_TRANSMISSIONMAP
+
+	uniform mat3 transmissionMapTransform;
+	varying vec2 vTransmissionMapUv;
+
+#endif
+#ifdef USE_THICKNESSMAP
 
-	uniform mat3 uvTransform;
+	uniform mat3 thicknessMapTransform;
+	varying vec2 vThicknessMapUv;
 
 #endif
 `;

+ 111 - 1
src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js

@@ -1,7 +1,117 @@
 export default /* glsl */`
 #ifdef USE_UV
 
-	vUv = ( uvTransform * vec3( uv, 1 ) ).xy;
+	vUv = vec3( uv, 1 ).xy;
+
+#endif
+#ifdef USE_MAP
+
+	vMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_ALPHAMAP
+
+	vAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_LIGHTMAP
+
+	vLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_AOMAP
+
+	vAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_BUMPMAP
+
+	vBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_NORMALMAP
+
+	vNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_DISPLACEMENTMAP
+
+	vDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_EMISSIVEMAP
+
+	vEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_METALNESSMAP
+
+	vMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_ROUGHNESSMAP
+
+	vRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_CLEARCOATMAP
+
+	vClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_CLEARCOAT_NORMALMAP
+
+	vClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_CLEARCOAT_ROUGHNESSMAP
+
+	vClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_IRIDESCENCEMAP
+
+	vIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_IRIDESCENCE_THICKNESSMAP
+
+	vIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_SHEEN_COLORMAP
+
+	vSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_SHEEN_ROUGHNESSMAP
+
+	vSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_SPECULARMAP
+
+	vSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_SPECULAR_COLORMAP
+
+	vSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_SPECULAR_INTENSITYMAP
+
+	vSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_TRANSMISSIONMAP
+
+	vTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;
+
+#endif
+#ifdef USE_THICKNESSMAP
+
+	vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;
 
 #endif
 `;

+ 15 - 4
src/renderers/shaders/ShaderLib.js

@@ -306,33 +306,44 @@ ShaderLib.physical = {
 		{
 			clearcoat: { value: 0 },
 			clearcoatMap: { value: null },
+			clearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },
+			clearcoatNormalMap: { value: null },
+			clearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },
+			clearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },
 			clearcoatRoughness: { value: 0 },
 			clearcoatRoughnessMap: { value: null },
-			clearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },
-			clearcoatNormalMap: { value: null },
+			clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			iridescence: { value: 0 },
 			iridescenceMap: { value: null },
+			iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			iridescenceIOR: { value: 1.3 },
 			iridescenceThicknessMinimum: { value: 100 },
 			iridescenceThicknessMaximum: { value: 400 },
 			iridescenceThicknessMap: { value: null },
+			iridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			sheen: { value: 0 },
 			sheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },
 			sheenColorMap: { value: null },
+			sheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			sheenRoughness: { value: 1 },
 			sheenRoughnessMap: { value: null },
+			sheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			transmission: { value: 0 },
 			transmissionMap: { value: null },
+			transmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			transmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },
 			transmissionSamplerMap: { value: null },
 			thickness: { value: 0 },
 			thicknessMap: { value: null },
+			thicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 			attenuationDistance: { value: 0 },
 			attenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },
-			specularIntensity: { value: 1 },
-			specularIntensityMap: { value: null },
 			specularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },
 			specularColorMap: { value: null },
+			specularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },
+			specularIntensity: { value: 1 },
+			specularIntensityMap: { value: null },
+			specularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() }
 		}
 	] ),
 

+ 1 - 4
src/renderers/shaders/ShaderLib/meshbasic.glsl.js

@@ -1,7 +1,6 @@
 export const vertex = /* glsl */`
 #include <common>
 #include <uv_pars_vertex>
-#include <uv2_pars_vertex>
 #include <envmap_pars_vertex>
 #include <color_pars_vertex>
 #include <fog_pars_vertex>
@@ -13,7 +12,6 @@ export const vertex = /* glsl */`
 void main() {
 
 	#include <uv_vertex>
-	#include <uv2_vertex>
 	#include <color_vertex>
 	#include <morphcolor_vertex>
 
@@ -55,7 +53,6 @@ uniform float opacity;
 #include <dithering_pars_fragment>
 #include <color_pars_fragment>
 #include <uv_pars_fragment>
-#include <uv2_pars_fragment>
 #include <map_pars_fragment>
 #include <alphamap_pars_fragment>
 #include <alphatest_pars_fragment>
@@ -86,7 +83,7 @@ void main() {
 	// accumulation (baked indirect lighting only)
 	#ifdef USE_LIGHTMAP
 
-		vec4 lightMapTexel = texture2D( lightMap, vUv2 );
+		vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );
 		reflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;
 
 	#else

+ 0 - 3
src/renderers/shaders/ShaderLib/meshlambert.glsl.js

@@ -5,7 +5,6 @@ varying vec3 vViewPosition;
 
 #include <common>
 #include <uv_pars_vertex>
-#include <uv2_pars_vertex>
 #include <displacementmap_pars_vertex>
 #include <envmap_pars_vertex>
 #include <color_pars_vertex>
@@ -20,7 +19,6 @@ varying vec3 vViewPosition;
 void main() {
 
 	#include <uv_vertex>
-	#include <uv2_vertex>
 	#include <color_vertex>
 	#include <morphcolor_vertex>
 
@@ -61,7 +59,6 @@ uniform float opacity;
 #include <dithering_pars_fragment>
 #include <color_pars_fragment>
 #include <uv_pars_fragment>
-#include <uv2_pars_fragment>
 #include <map_pars_fragment>
 #include <alphamap_pars_fragment>
 #include <alphatest_pars_fragment>

+ 3 - 3
src/renderers/shaders/ShaderLib/meshnormal.glsl.js

@@ -1,7 +1,7 @@
 export const vertex = /* glsl */`
 #define NORMAL
 
-#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )
 
 	varying vec3 vViewPosition;
 
@@ -35,7 +35,7 @@ void main() {
 	#include <logdepthbuf_vertex>
 	#include <clipping_planes_vertex>
 
-#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )
 
 	vViewPosition = - mvPosition.xyz;
 
@@ -49,7 +49,7 @@ export const fragment = /* glsl */`
 
 uniform float opacity;
 
-#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
+#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )
 
 	varying vec3 vViewPosition;
 

+ 0 - 3
src/renderers/shaders/ShaderLib/meshphong.glsl.js

@@ -5,7 +5,6 @@ varying vec3 vViewPosition;
 
 #include <common>
 #include <uv_pars_vertex>
-#include <uv2_pars_vertex>
 #include <displacementmap_pars_vertex>
 #include <envmap_pars_vertex>
 #include <color_pars_vertex>
@@ -20,7 +19,6 @@ varying vec3 vViewPosition;
 void main() {
 
 	#include <uv_vertex>
-	#include <uv2_vertex>
 	#include <color_vertex>
 	#include <morphcolor_vertex>
 
@@ -63,7 +61,6 @@ uniform float opacity;
 #include <dithering_pars_fragment>
 #include <color_pars_fragment>
 #include <uv_pars_fragment>
-#include <uv2_pars_fragment>
 #include <map_pars_fragment>
 #include <alphamap_pars_fragment>
 #include <alphatest_pars_fragment>

+ 8 - 11
src/renderers/shaders/ShaderLib/meshphysical.glsl.js

@@ -11,7 +11,6 @@ varying vec3 vViewPosition;
 
 #include <common>
 #include <uv_pars_vertex>
-#include <uv2_pars_vertex>
 #include <displacementmap_pars_vertex>
 #include <color_pars_vertex>
 #include <fog_pars_vertex>
@@ -25,7 +24,6 @@ varying vec3 vViewPosition;
 void main() {
 
 	#include <uv_vertex>
-	#include <uv2_vertex>
 	#include <color_vertex>
 	#include <morphcolor_vertex>
 
@@ -63,7 +61,7 @@ export const fragment = /* glsl */`
 
 #ifdef PHYSICAL
 	#define IOR
-	#define SPECULAR
+	#define USE_SPECULAR
 #endif
 
 uniform vec3 diffuse;
@@ -76,16 +74,16 @@ uniform float opacity;
 	uniform float ior;
 #endif
 
-#ifdef SPECULAR
+#ifdef USE_SPECULAR
 	uniform float specularIntensity;
 	uniform vec3 specularColor;
 
-	#ifdef USE_SPECULARINTENSITYMAP
-		uniform sampler2D specularIntensityMap;
+	#ifdef USE_SPECULAR_COLORMAP
+		uniform sampler2D specularColorMap;
 	#endif
 
-	#ifdef USE_SPECULARCOLORMAP
-		uniform sampler2D specularColorMap;
+	#ifdef USE_SPECULAR_INTENSITYMAP
+		uniform sampler2D specularIntensityMap;
 	#endif
 #endif
 
@@ -105,11 +103,11 @@ uniform float opacity;
 	uniform vec3 sheenColor;
 	uniform float sheenRoughness;
 
-	#ifdef USE_SHEENCOLORMAP
+	#ifdef USE_SHEEN_COLORMAP
 		uniform sampler2D sheenColorMap;
 	#endif
 
-	#ifdef USE_SHEENROUGHNESSMAP
+	#ifdef USE_SHEEN_ROUGHNESSMAP
 		uniform sampler2D sheenRoughnessMap;
 	#endif
 #endif
@@ -121,7 +119,6 @@ varying vec3 vViewPosition;
 #include <dithering_pars_fragment>
 #include <color_pars_fragment>
 #include <uv_pars_fragment>
-#include <uv2_pars_fragment>
 #include <map_pars_fragment>
 #include <alphamap_pars_fragment>
 #include <alphatest_pars_fragment>

+ 0 - 3
src/renderers/shaders/ShaderLib/meshtoon.glsl.js

@@ -5,7 +5,6 @@ varying vec3 vViewPosition;
 
 #include <common>
 #include <uv_pars_vertex>
-#include <uv2_pars_vertex>
 #include <displacementmap_pars_vertex>
 #include <color_pars_vertex>
 #include <fog_pars_vertex>
@@ -19,7 +18,6 @@ varying vec3 vViewPosition;
 void main() {
 
 	#include <uv_vertex>
-	#include <uv2_vertex>
 	#include <color_vertex>
 	#include <morphcolor_vertex>
 
@@ -59,7 +57,6 @@ uniform float opacity;
 #include <dithering_pars_fragment>
 #include <color_pars_fragment>
 #include <uv_pars_fragment>
-#include <uv2_pars_fragment>
 #include <map_pars_fragment>
 #include <alphamap_pars_fragment>
 #include <alphatest_pars_fragment>

+ 25 - 15
src/renderers/shaders/UniformsLib.js

@@ -14,10 +14,11 @@ const UniformsLib = {
 		opacity: { value: 1.0 },
 
 		map: { value: null },
-		uvTransform: { value: /*@__PURE__*/ new Matrix3() },
-		uv2Transform: { value: /*@__PURE__*/ new Matrix3() },
+		mapTransform: { value: /*@__PURE__*/ new Matrix3() },
 
 		alphaMap: { value: null },
+		alphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },
+
 		alphaTest: { value: 0 }
 
 	},
@@ -25,6 +26,7 @@ const UniformsLib = {
 	specularmap: {
 
 		specularMap: { value: null },
+		specularMapTransform: { value: /*@__PURE__*/ new Matrix3() }
 
 	},
 
@@ -41,26 +43,23 @@ const UniformsLib = {
 	aomap: {
 
 		aoMap: { value: null },
-		aoMapIntensity: { value: 1 }
+		aoMapIntensity: { value: 1 },
+		aoMapTransform: { value: /*@__PURE__*/ new Matrix3() }
 
 	},
 
 	lightmap: {
 
 		lightMap: { value: null },
-		lightMapIntensity: { value: 1 }
-
-	},
-
-	emissivemap: {
-
-		emissiveMap: { value: null }
+		lightMapIntensity: { value: 1 },
+		lightMapTransform: { value: /*@__PURE__*/ new Matrix3() }
 
 	},
 
 	bumpmap: {
 
 		bumpMap: { value: null },
+		bumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 		bumpScale: { value: 1 }
 
 	},
@@ -68,6 +67,7 @@ const UniformsLib = {
 	normalmap: {
 
 		normalMap: { value: null },
+		normalMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 		normalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }
 
 	},
@@ -75,20 +75,30 @@ const UniformsLib = {
 	displacementmap: {
 
 		displacementMap: { value: null },
+		displacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },
 		displacementScale: { value: 1 },
 		displacementBias: { value: 0 }
 
 	},
 
-	roughnessmap: {
+	emissivemap: {
 
-		roughnessMap: { value: null }
+		emissiveMap: { value: null },
+		emissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }
 
 	},
 
 	metalnessmap: {
 
-		metalnessMap: { value: null }
+		metalnessMap: { value: null },
+		metalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }
+
+	},
+
+	roughnessmap: {
+
+		roughnessMap: { value: null },
+		roughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }
 
 	},
 
@@ -207,9 +217,9 @@ const UniformsLib = {
 		center: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },
 		rotation: { value: 0.0 },
 		map: { value: null },
+		mapTransform: { value: /*@__PURE__*/ new Matrix3() },
 		alphaMap: { value: null },
-		alphaTest: { value: 0 },
-		uvTransform: { value: /*@__PURE__*/ new Matrix3() }
+		alphaTest: { value: 0 }
 
 	}
 

+ 93 - 238
src/renderers/webgl/WebGLMaterials.js

@@ -3,6 +3,18 @@ import { getUnlitUniformColorSpace } from '../shaders/UniformsUtils.js';
 
 function WebGLMaterials( renderer, properties ) {
 
+	function refreshTransformUniform( map, uniform ) {
+
+		if ( map.matrixAutoUpdate === true ) {
+
+			map.updateMatrix();
+
+		}
+
+		uniform.value.copy( map.matrix );
+
+	}
+
 	function refreshFogUniforms( uniforms, fog ) {
 
 		fog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );
@@ -120,25 +132,56 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.map.value = material.map;
 
+			refreshTransformUniform( material.map, uniforms.mapTransform );
+
 		}
 
 		if ( material.alphaMap ) {
 
 			uniforms.alphaMap.value = material.alphaMap;
 
+			refreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );
+
 		}
 
 		if ( material.bumpMap ) {
 
 			uniforms.bumpMap.value = material.bumpMap;
+
+			refreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );
+
 			uniforms.bumpScale.value = material.bumpScale;
-			if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
+
+			if ( material.side === BackSide ) {
+
+				uniforms.bumpScale.value *= - 1;
+
+			}
+
+		}
+
+		if ( material.normalMap ) {
+
+			uniforms.normalMap.value = material.normalMap;
+
+			refreshTransformUniform( material.normalMap, uniforms.normalMapTransform );
+
+			uniforms.normalScale.value.copy( material.normalScale );
+
+			if ( material.side === BackSide ) {
+
+				uniforms.normalScale.value.negate();
+
+			}
 
 		}
 
 		if ( material.displacementMap ) {
 
 			uniforms.displacementMap.value = material.displacementMap;
+
+			refreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );
+
 			uniforms.displacementScale.value = material.displacementScale;
 			uniforms.displacementBias.value = material.displacementBias;
 
@@ -148,13 +191,7 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.emissiveMap.value = material.emissiveMap;
 
-		}
-
-		if ( material.normalMap ) {
-
-			uniforms.normalMap.value = material.normalMap;
-			uniforms.normalScale.value.copy( material.normalScale );
-			if ( material.side === BackSide ) uniforms.normalScale.value.negate();
+			refreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );
 
 		}
 
@@ -162,6 +199,8 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.specularMap.value = material.specularMap;
 
+			refreshTransformUniform( material.specularMap, uniforms.specularMapTransform );
+
 		}
 
 		if ( material.alphaTest > 0 ) {
@@ -193,6 +232,8 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;
 
+			refreshTransformUniform( material.lightMap, uniforms.lightMapTransform );
+
 		}
 
 		if ( material.aoMap ) {
@@ -200,163 +241,7 @@ function WebGLMaterials( renderer, properties ) {
 			uniforms.aoMap.value = material.aoMap;
 			uniforms.aoMapIntensity.value = material.aoMapIntensity;
 
-		}
-
-		// uv repeat and offset setting priorities
-		// 1. color map
-		// 2. specular map
-		// 3. displacementMap map
-		// 4. normal map
-		// 5. bump map
-		// 6. roughnessMap map
-		// 7. metalnessMap map
-		// 8. alphaMap map
-		// 9. emissiveMap map
-		// 10. clearcoat map
-		// 11. clearcoat normal map
-		// 12. clearcoat roughnessMap map
-		// 13. iridescence map
-		// 14. iridescence thickness map
-		// 15. specular intensity map
-		// 16. specular tint map
-		// 17. transmission map
-		// 18. thickness map
-
-		let uvScaleMap;
-
-		if ( material.map ) {
-
-			uvScaleMap = material.map;
-
-		} else if ( material.specularMap ) {
-
-			uvScaleMap = material.specularMap;
-
-		} else if ( material.displacementMap ) {
-
-			uvScaleMap = material.displacementMap;
-
-		} else if ( material.normalMap ) {
-
-			uvScaleMap = material.normalMap;
-
-		} else if ( material.bumpMap ) {
-
-			uvScaleMap = material.bumpMap;
-
-		} else if ( material.roughnessMap ) {
-
-			uvScaleMap = material.roughnessMap;
-
-		} else if ( material.metalnessMap ) {
-
-			uvScaleMap = material.metalnessMap;
-
-		} else if ( material.alphaMap ) {
-
-			uvScaleMap = material.alphaMap;
-
-		} else if ( material.emissiveMap ) {
-
-			uvScaleMap = material.emissiveMap;
-
-		} else if ( material.clearcoatMap ) {
-
-			uvScaleMap = material.clearcoatMap;
-
-		} else if ( material.clearcoatNormalMap ) {
-
-			uvScaleMap = material.clearcoatNormalMap;
-
-		} else if ( material.clearcoatRoughnessMap ) {
-
-			uvScaleMap = material.clearcoatRoughnessMap;
-
-		} else if ( material.iridescenceMap ) {
-
-			uvScaleMap = material.iridescenceMap;
-
-		} else if ( material.iridescenceThicknessMap ) {
-
-			uvScaleMap = material.iridescenceThicknessMap;
-
-		} else if ( material.specularIntensityMap ) {
-
-			uvScaleMap = material.specularIntensityMap;
-
-		} else if ( material.specularColorMap ) {
-
-			uvScaleMap = material.specularColorMap;
-
-		} else if ( material.transmissionMap ) {
-
-			uvScaleMap = material.transmissionMap;
-
-		} else if ( material.thicknessMap ) {
-
-			uvScaleMap = material.thicknessMap;
-
-		} else if ( material.sheenColorMap ) {
-
-			uvScaleMap = material.sheenColorMap;
-
-		} else if ( material.sheenRoughnessMap ) {
-
-			uvScaleMap = material.sheenRoughnessMap;
-
-		}
-
-		if ( uvScaleMap !== undefined ) {
-
-			// backwards compatibility
-			if ( uvScaleMap.isWebGLRenderTarget ) {
-
-				uvScaleMap = uvScaleMap.texture;
-
-			}
-
-			if ( uvScaleMap.matrixAutoUpdate === true ) {
-
-				uvScaleMap.updateMatrix();
-
-			}
-
-			uniforms.uvTransform.value.copy( uvScaleMap.matrix );
-
-		}
-
-		// uv repeat and offset setting priorities for uv2
-		// 1. ao map
-		// 2. light map
-
-		let uv2ScaleMap;
-
-		if ( material.aoMap ) {
-
-			uv2ScaleMap = material.aoMap;
-
-		} else if ( material.lightMap ) {
-
-			uv2ScaleMap = material.lightMap;
-
-		}
-
-		if ( uv2ScaleMap !== undefined ) {
-
-			// backwards compatibility
-			if ( uv2ScaleMap.isWebGLRenderTarget ) {
-
-				uv2ScaleMap = uv2ScaleMap.texture;
-
-			}
-
-			if ( uv2ScaleMap.matrixAutoUpdate === true ) {
-
-				uv2ScaleMap.updateMatrix();
-
-			}
-
-			uniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );
+			refreshTransformUniform( material.aoMap, uniforms.aoMapTransform );
 
 		}
 
@@ -371,13 +256,7 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.map.value = material.map;
 
-			if ( material.map.matrixAutoUpdate === true ) {
-
-				material.map.updateMatrix();
-
-			}
-
-			uniforms.uvTransform.value.copy( material.map.matrix );
+			refreshTransformUniform( material.map, uniforms.mapTransform );
 
 		}
 
@@ -402,6 +281,8 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.map.value = material.map;
 
+			refreshTransformUniform( material.map, uniforms.uvTransform );
+
 		}
 
 		if ( material.alphaMap ) {
@@ -416,34 +297,6 @@ function WebGLMaterials( renderer, properties ) {
 
 		}
 
-		// uv repeat and offset setting priorities
-		// 1. color map
-		// 2. alpha map
-
-		let uvScaleMap;
-
-		if ( material.map ) {
-
-			uvScaleMap = material.map;
-
-		} else if ( material.alphaMap ) {
-
-			uvScaleMap = material.alphaMap;
-
-		}
-
-		if ( uvScaleMap !== undefined ) {
-
-			if ( uvScaleMap.matrixAutoUpdate === true ) {
-
-				uvScaleMap.updateMatrix();
-
-			}
-
-			uniforms.uvTransform.value.copy( uvScaleMap.matrix );
-
-		}
-
 	}
 
 	function refreshUniformsSprites( uniforms, material ) {
@@ -456,6 +309,8 @@ function WebGLMaterials( renderer, properties ) {
 
 			uniforms.map.value = material.map;
 
+			refreshTransformUniform( material.map, uniforms.mapTransform );
+
 		}
 
 		if ( material.alphaMap ) {
@@ -470,34 +325,6 @@ function WebGLMaterials( renderer, properties ) {
 
 		}
 
-		// uv repeat and offset setting priorities
-		// 1. color map
-		// 2. alpha map
-
-		let uvScaleMap;
-
-		if ( material.map ) {
-
-			uvScaleMap = material.map;
-
-		} else if ( material.alphaMap ) {
-
-			uvScaleMap = material.alphaMap;
-
-		}
-
-		if ( uvScaleMap !== undefined ) {
-
-			if ( uvScaleMap.matrixAutoUpdate === true ) {
-
-				uvScaleMap.updateMatrix();
-
-			}
-
-			uniforms.uvTransform.value.copy( uvScaleMap.matrix );
-
-		}
-
 	}
 
 	function refreshUniformsPhong( uniforms, material ) {
@@ -519,18 +346,23 @@ function WebGLMaterials( renderer, properties ) {
 
 	function refreshUniformsStandard( uniforms, material ) {
 
-		uniforms.roughness.value = material.roughness;
 		uniforms.metalness.value = material.metalness;
 
-		if ( material.roughnessMap ) {
+		if ( material.metalnessMap ) {
 
-			uniforms.roughnessMap.value = material.roughnessMap;
+			uniforms.metalnessMap.value = material.metalnessMap;
+
+			refreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );
 
 		}
 
-		if ( material.metalnessMap ) {
+		uniforms.roughness.value = material.roughness;
 
-			uniforms.metalnessMap.value = material.metalnessMap;
+		if ( material.roughnessMap ) {
+
+			uniforms.roughnessMap.value = material.roughnessMap;
+
+			refreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );
 
 		}
 
@@ -559,12 +391,16 @@ function WebGLMaterials( renderer, properties ) {
 
 				uniforms.sheenColorMap.value = material.sheenColorMap;
 
+				refreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );
+
 			}
 
 			if ( material.sheenRoughnessMap ) {
 
 				uniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;
 
+				refreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );
+
 			}
 
 		}
@@ -578,19 +414,26 @@ function WebGLMaterials( renderer, properties ) {
 
 				uniforms.clearcoatMap.value = material.clearcoatMap;
 
+				refreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );
+
 			}
 
 			if ( material.clearcoatRoughnessMap ) {
 
 				uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;
 
+				refreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );
+
 			}
 
 			if ( material.clearcoatNormalMap ) {
 
-				uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
 				uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;
 
+				refreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );
+
+				uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
+
 				if ( material.side === BackSide ) {
 
 					uniforms.clearcoatNormalScale.value.negate();
@@ -612,12 +455,16 @@ function WebGLMaterials( renderer, properties ) {
 
 				uniforms.iridescenceMap.value = material.iridescenceMap;
 
+				refreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );
+
 			}
 
 			if ( material.iridescenceThicknessMap ) {
 
 				uniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;
 
+				refreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );
+
 			}
 
 		}
@@ -632,6 +479,8 @@ function WebGLMaterials( renderer, properties ) {
 
 				uniforms.transmissionMap.value = material.transmissionMap;
 
+				refreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );
+
 			}
 
 			uniforms.thickness.value = material.thickness;
@@ -640,6 +489,8 @@ function WebGLMaterials( renderer, properties ) {
 
 				uniforms.thicknessMap.value = material.thicknessMap;
 
+				refreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );
+
 			}
 
 			uniforms.attenuationDistance.value = material.attenuationDistance;
@@ -650,15 +501,19 @@ function WebGLMaterials( renderer, properties ) {
 		uniforms.specularIntensity.value = material.specularIntensity;
 		uniforms.specularColor.value.copy( material.specularColor );
 
-		if ( material.specularIntensityMap ) {
+		if ( material.specularColorMap ) {
 
-			uniforms.specularIntensityMap.value = material.specularIntensityMap;
+			uniforms.specularColorMap.value = material.specularColorMap;
+
+			refreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );
 
 		}
 
-		if ( material.specularColorMap ) {
+		if ( material.specularIntensityMap ) {
 
-			uniforms.specularColorMap.value = material.specularColorMap;
+			uniforms.specularIntensityMap.value = material.specularIntensityMap;
+
+			refreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );
 
 		}
 

+ 56 - 26
src/renderers/webgl/WebGLProgram.js

@@ -110,7 +110,7 @@ function getToneMappingFunction( functionName, toneMapping ) {
 function generateExtensions( parameters ) {
 
 	const chunks = [
-		( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
+		( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.normalMapTangentSpace || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
 		( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',
 		( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',
 		( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''
@@ -454,21 +454,20 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.instancing ? '#define USE_INSTANCING' : '',
 			parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',
 
-			parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
-
-			( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
-			( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',
+			parameters.useFog && parameters.fog ? '#define USE_FOG' : '',
+			parameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',
 
 			parameters.map ? '#define USE_MAP' : '',
 			parameters.envMap ? '#define USE_ENVMAP' : '',
 			parameters.envMap ? '#define ' + envMapModeDefine : '',
 			parameters.lightMap ? '#define USE_LIGHTMAP' : '',
 			parameters.aoMap ? '#define USE_AOMAP' : '',
-			parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
 			parameters.bumpMap ? '#define USE_BUMPMAP' : '',
 			parameters.normalMap ? '#define USE_NORMALMAP' : '',
-			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
-			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
+			parameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',
+			parameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',
+			parameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',
+			parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
 
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
@@ -477,11 +476,9 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',
 			parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',
 
-			parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
-
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
-			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
-			parameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',
+			parameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',
+			parameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',
 
 			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
 			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
@@ -491,14 +488,47 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
 			parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
 
-			parameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',
-			parameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',
+			parameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',
+			parameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',
+
+			//
+
+			parameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',
+			parameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',
+			parameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',
+			parameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',
+			parameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',
+			parameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',
+			parameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',
+			parameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',
+
+			parameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',
+			parameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',
+
+			parameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',
+			parameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',
+			parameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',
+
+			parameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',
+			parameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',
+
+			parameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',
+			parameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',
+
+			parameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',
+			parameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',
+			parameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',
+
+			parameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',
+			parameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',
+
+			//
 
 			parameters.vertexTangents ? '#define USE_TANGENT' : '',
 			parameters.vertexColors ? '#define USE_COLOR' : '',
 			parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
 			parameters.vertexUvs ? '#define USE_UV' : '',
-			parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',
+			parameters.vertexUvs2 ? '#define USE_UV2' : '',
 
 			parameters.pointsUvs ? '#define USE_POINTS_UV' : '',
 
@@ -609,8 +639,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 
 			customDefines,
 
-			( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
-			( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',
+			parameters.useFog && parameters.fog ? '#define USE_FOG' : '',
+			parameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',
 
 			parameters.map ? '#define USE_MAP' : '',
 			parameters.matcap ? '#define USE_MATCAP' : '',
@@ -623,11 +653,11 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			envMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',
 			parameters.lightMap ? '#define USE_LIGHTMAP' : '',
 			parameters.aoMap ? '#define USE_AOMAP' : '',
-			parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
 			parameters.bumpMap ? '#define USE_BUMPMAP' : '',
 			parameters.normalMap ? '#define USE_NORMALMAP' : '',
-			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
-			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
+			parameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',
+			parameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',
+			parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
 
 			parameters.clearcoat ? '#define USE_CLEARCOAT' : '',
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
@@ -639,8 +669,9 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',
 
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
-			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
-			parameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',
+			parameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',
+			parameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',
+
 			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
 			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
 
@@ -648,8 +679,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.alphaTest ? '#define USE_ALPHATEST' : '',
 
 			parameters.sheen ? '#define USE_SHEEN' : '',
-			parameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',
-			parameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',
+			parameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',
+			parameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',
 
 			parameters.transmission ? '#define USE_TRANSMISSION' : '',
 			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
@@ -660,8 +691,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.vertexTangents ? '#define USE_TANGENT' : '',
 			parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',
 			parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
-			parameters.vertexUvs ? '#define USE_UV' : '',
-			parameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',
+			parameters.vertexUvs2 ? '#define USE_UV2' : '',
 
 			parameters.pointsUvs ? '#define USE_POINTS_UV' : '',
 

+ 192 - 130
src/renderers/webgl/WebGLPrograms.js

@@ -11,9 +11,10 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 	const _customShaders = new WebGLShaderCache();
 	const programs = [];
 
-	const isWebGL2 = capabilities.isWebGL2;
+	const IS_WEBGL2 = capabilities.isWebGL2;
 	const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
-	const vertexTextures = capabilities.vertexTextures;
+	const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
+
 	let precision = capabilities.precision;
 
 	const shaderIDs = {
@@ -34,6 +35,14 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 		SpriteMaterial: 'sprite'
 	};
 
+	function getChannel( value ) {
+
+		if ( value === 1 ) return 'uv2';
+
+		return 'uv';
+
+	}
+
 	function getParameters( material, lights, shadows, scene, object ) {
 
 		const fog = scene.fog;
@@ -97,16 +106,57 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 
 		const currentRenderTarget = renderer.getRenderTarget();
 
-		const useAlphaTest = material.alphaTest > 0;
+		const IS_INSTANCEDMESH = object.isInstancedMesh === true;
+
+		const HAS_MAP = !! material.map;
+		const HAS_MATCAP = !! material.matcap;
+		const HAS_ENVMAP = !! envMap;
+		const HAS_AOMAP = !! material.aoMap;
+		const HAS_LIGHTMAP = !! material.lightMap;
+		const HAS_BUMPMAP = !! material.bumpMap;
+		const HAS_NORMALMAP = !! material.normalMap;
+		const HAS_DISPLACEMENTMAP = !! material.displacementMap;
+		const HAS_EMISSIVEMAP = !! material.emissiveMap;
+
+		const HAS_METALNESSMAP = !! material.metalnessMap;
+		const HAS_ROUGHNESSMAP = !! material.roughnessMap;
+
+		const HAS_CLEARCOAT = material.clearcoat > 0;
+		const HAS_IRIDESCENCE = material.iridescence > 0;
+		const HAS_SHEEN = material.sheen > 0;
+		const HAS_TRANSMISSION = material.transmission > 0;
+
+		const HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;
+		const HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;
+		const HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;
+
+		const HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;
+		const HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;
+
+		const HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;
+		const HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;
+
+		const HAS_SPECULARMAP = !! material.specularMap;
+		const HAS_SPECULAR_COLORMAP = !! material.specularColorMap;
+		const HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;
+
+		const HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;
+		const HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;
+
+		const HAS_GRADIENTMAP = !! material.gradientMap;
+
+		const HAS_ALPHAMAP = !! material.alphaMap;
+
+		const HAS_ALPHATEST = material.alphaTest > 0;
+
+		const HAS_EXTENSIONS = !! material.extensions;
 
-		const useClearcoat = material.clearcoat > 0;
-		const useIridescence = material.iridescence > 0;
-		const useSheen = material.sheen > 0;
-		const useTransmission = material.transmission > 0;
+		const HAS_ATTRIBUTE_UV = !! geometry.attributes.uv;
+		const HAS_ATTRIBUTE_UV2 = !! geometry.attributes.uv2;
 
 		const parameters = {
 
-			isWebGL2: isWebGL2,
+			isWebGL2: IS_WEBGL2,
 
 			shaderID: shaderID,
 			shaderName: material.type,
@@ -123,74 +173,111 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 
 			precision: precision,
 
-			instancing: object.isInstancedMesh === true,
-			instancingColor: object.isInstancedMesh === true && object.instanceColor !== null,
+			instancing: IS_INSTANCEDMESH,
+			instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,
 
-			supportsVertexTextures: vertexTextures,
+			supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,
 			outputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),
-			map: !! material.map,
-			matcap: !! material.matcap,
-			envMap: !! envMap,
-			envMapMode: envMap && envMap.mapping,
+
+			map: HAS_MAP,
+			matcap: HAS_MATCAP,
+			envMap: HAS_ENVMAP,
+			envMapMode: HAS_ENVMAP && envMap.mapping,
 			envMapCubeUVHeight: envMapCubeUVHeight,
-			lightMap: !! material.lightMap,
-			aoMap: !! material.aoMap,
-			emissiveMap: !! material.emissiveMap,
-			bumpMap: !! material.bumpMap,
-			normalMap: !! material.normalMap,
-			objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
-			tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,
-
-			decodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),
-
-			clearcoat: useClearcoat,
-			clearcoatMap: useClearcoat && !! material.clearcoatMap,
-			clearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,
-			clearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,
-
-			iridescence: useIridescence,
-			iridescenceMap: useIridescence && !! material.iridescenceMap,
-			iridescenceThicknessMap: useIridescence && !! material.iridescenceThicknessMap,
-
-			sheen: useSheen,
-			sheenColorMap: useSheen && !! material.sheenColorMap,
-			sheenRoughnessMap: useSheen && !! material.sheenRoughnessMap,
-
-			transmission: useTransmission,
-			transmissionMap: useTransmission && !! material.transmissionMap,
-			thicknessMap: useTransmission && !! material.thicknessMap,
-
-			displacementMap: !! material.displacementMap,
-			roughnessMap: !! material.roughnessMap,
-			metalnessMap: !! material.metalnessMap,
-			specularMap: !! material.specularMap,
-			specularIntensityMap: !! material.specularIntensityMap,
-			specularColorMap: !! material.specularColorMap,
+			aoMap: HAS_AOMAP,
+			lightMap: HAS_LIGHTMAP,
+			bumpMap: HAS_BUMPMAP,
+			normalMap: HAS_NORMALMAP,
+			displacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,
+			emissiveMap: HAS_EMISSIVEMAP,
 
-			opaque: material.transparent === false && material.blending === NormalBlending,
+			normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,
+			normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,
+
+			decodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),
+
+			metalnessMap: HAS_METALNESSMAP,
+			roughnessMap: HAS_ROUGHNESSMAP,
+
+			clearcoat: HAS_CLEARCOAT,
+			clearcoatMap: HAS_CLEARCOATMAP,
+			clearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,
+			clearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,
+
+			iridescence: HAS_IRIDESCENCE,
+			iridescenceMap: HAS_IRIDESCENCEMAP,
+			iridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,
+
+			sheen: HAS_SHEEN,
+			sheenColorMap: HAS_SHEEN_COLORMAP,
+			sheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,
+
+			specularMap: HAS_SPECULARMAP,
+			specularColorMap: HAS_SPECULAR_COLORMAP,
+			specularIntensityMap: HAS_SPECULAR_INTENSITYMAP,
+
+			transmission: HAS_TRANSMISSION,
+			transmissionMap: HAS_TRANSMISSIONMAP,
+			thicknessMap: HAS_THICKNESSMAP,
 
-			alphaMap: !! material.alphaMap,
-			alphaTest: useAlphaTest,
+			gradientMap: HAS_GRADIENTMAP,
 
-			gradientMap: !! material.gradientMap,
+			opaque: material.transparent === false && material.blending === NormalBlending,
+
+			alphaMap: HAS_ALPHAMAP,
+			alphaTest: HAS_ALPHATEST,
 
 			combine: material.combine,
 
-			vertexTangents: ( !! material.normalMap && !! geometry.attributes.tangent ),
+			//
+
+			mapUv: HAS_MAP && getChannel( material.map.channel ),
+			aoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),
+			lightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),
+			bumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),
+			normalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),
+			displacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),
+			emissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),
+
+			metalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),
+			roughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),
+
+			clearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),
+			clearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),
+			clearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),
+
+			iridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),
+			iridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),
+
+			sheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),
+			sheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),
+
+			specularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),
+			specularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),
+			specularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),
+
+			transmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),
+			thicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),
+
+			alphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),
+
+			//
+
+			vertexTangents: HAS_NORMALMAP && !! geometry.attributes.tangent,
 			vertexColors: material.vertexColors,
 			vertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,
-			vertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.iridescenceMap || !! material.iridescenceThicknessMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,
-			uvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || !! material.iridescenceMap || !! material.iridescenceThicknessMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,
+			vertexUvs: HAS_ATTRIBUTE_UV,
+			vertexUvs2: HAS_ATTRIBUTE_UV2,
 
-			pointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( !! material.map || !! material.alphaMap ),
+			pointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),
 
 			fog: !! fog,
 			useFog: material.fog === true,
 			fogExp2: ( fog && fog.isFogExp2 ),
 
-			flatShading: !! material.flatShading,
+			flatShading: material.flatShading === true,
 
-			sizeAttenuation: material.sizeAttenuation,
+			sizeAttenuation: material.sizeAttenuation === true,
 			logarithmicDepthBuffer: logarithmicDepthBuffer,
 
 			skinning: object.isSkinnedMesh === true,
@@ -229,19 +316,19 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 			doubleSided: material.side === DoubleSide,
 			flipSided: material.side === BackSide,
 
-			useDepthPacking: !! material.depthPacking,
+			useDepthPacking: material.depthPacking >= 0,
 			depthPacking: material.depthPacking || 0,
 
 			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,
+			extensionDerivatives: HAS_EXTENSIONS && material.extensions.derivatives === true,
+			extensionFragDepth: HAS_EXTENSIONS && material.extensions.fragDepth === true,
+			extensionDrawBuffers: HAS_EXTENSIONS && material.extensions.drawBuffers === true,
+			extensionShaderTextureLOD: HAS_EXTENSIONS && material.extensions.shaderTextureLOD === true,
 
-			rendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),
-			rendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),
-			rendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),
+			rendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ),
+			rendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ),
+			rendererExtensionShaderTextureLod: IS_WEBGL2 || extensions.has( 'EXT_shader_texture_lod' ),
 
 			customProgramCacheKey: material.customProgramCacheKey()
 
@@ -297,8 +384,29 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 		array.push( parameters.outputEncoding );
 		array.push( parameters.envMapMode );
 		array.push( parameters.envMapCubeUVHeight );
+		array.push( parameters.mapUv );
+		array.push( parameters.alphaMapUv );
+		array.push( parameters.lightMapUv );
+		array.push( parameters.aoMapUv );
+		array.push( parameters.bumpMapUv );
+		array.push( parameters.normalMapUv );
+		array.push( parameters.displacementMapUv );
+		array.push( parameters.emissiveMapUv );
+		array.push( parameters.metalnessMapUv );
+		array.push( parameters.roughnessMapUv );
+		array.push( parameters.clearcoatMapUv );
+		array.push( parameters.clearcoatNormalMapUv );
+		array.push( parameters.clearcoatRoughnessMapUv );
+		array.push( parameters.iridescenceMapUv );
+		array.push( parameters.iridescenceThicknessMapUv );
+		array.push( parameters.sheenColorMapUv );
+		array.push( parameters.sheenRoughnessMapUv );
+		array.push( parameters.specularMapUv );
+		array.push( parameters.specularColorMapUv );
+		array.push( parameters.specularIntensityMapUv );
+		array.push( parameters.transmissionMapUv );
+		array.push( parameters.thicknessMapUv );
 		array.push( parameters.combine );
-		array.push( parameters.vertexUvs );
 		array.push( parameters.fogExp2 );
 		array.push( parameters.sizeAttenuation );
 		array.push( parameters.morphTargetsCount );
@@ -333,64 +441,30 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 			_programLayers.enable( 2 );
 		if ( parameters.instancingColor )
 			_programLayers.enable( 3 );
-		if ( parameters.map )
-			_programLayers.enable( 4 );
 		if ( parameters.matcap )
-			_programLayers.enable( 5 );
+			_programLayers.enable( 4 );
 		if ( parameters.envMap )
+			_programLayers.enable( 5 );
+		if ( parameters.normalMapObjectSpace )
 			_programLayers.enable( 6 );
-		if ( parameters.lightMap )
+		if ( parameters.normalMapTangentSpace )
 			_programLayers.enable( 7 );
-		if ( parameters.aoMap )
+		if ( parameters.clearcoat )
 			_programLayers.enable( 8 );
-		if ( parameters.emissiveMap )
+		if ( parameters.iridescence )
 			_programLayers.enable( 9 );
-		if ( parameters.bumpMap )
+		if ( parameters.alphaTest )
 			_programLayers.enable( 10 );
-		if ( parameters.normalMap )
+		if ( parameters.vertexColors )
 			_programLayers.enable( 11 );
-		if ( parameters.objectSpaceNormalMap )
+		if ( parameters.vertexAlphas )
 			_programLayers.enable( 12 );
-		if ( parameters.tangentSpaceNormalMap )
+		if ( parameters.vertexUvs )
 			_programLayers.enable( 13 );
-		if ( parameters.clearcoat )
+		if ( parameters.vertexUvs2 )
 			_programLayers.enable( 14 );
-		if ( parameters.clearcoatMap )
-			_programLayers.enable( 15 );
-		if ( parameters.clearcoatRoughnessMap )
-			_programLayers.enable( 16 );
-		if ( parameters.clearcoatNormalMap )
-			_programLayers.enable( 17 );
-		if ( parameters.iridescence )
-			_programLayers.enable( 18 );
-		if ( parameters.iridescenceMap )
-			_programLayers.enable( 19 );
-		if ( parameters.iridescenceThicknessMap )
-			_programLayers.enable( 20 );
-		if ( parameters.displacementMap )
-			_programLayers.enable( 21 );
-		if ( parameters.specularMap )
-			_programLayers.enable( 22 );
-		if ( parameters.roughnessMap )
-			_programLayers.enable( 23 );
-		if ( parameters.metalnessMap )
-			_programLayers.enable( 24 );
-		if ( parameters.gradientMap )
-			_programLayers.enable( 25 );
-		if ( parameters.alphaMap )
-			_programLayers.enable( 26 );
-		if ( parameters.alphaTest )
-			_programLayers.enable( 27 );
-		if ( parameters.vertexColors )
-			_programLayers.enable( 28 );
-		if ( parameters.vertexAlphas )
-			_programLayers.enable( 29 );
-		if ( parameters.vertexUvs )
-			_programLayers.enable( 30 );
 		if ( parameters.vertexTangents )
-			_programLayers.enable( 31 );
-		if ( parameters.uvsVertexOnly )
-			_programLayers.enable( 32 );
+			_programLayers.enable( 15 );
 
 		array.push( _programLayers.mask );
 		_programLayers.disableAll();
@@ -425,28 +499,16 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 			_programLayers.enable( 13 );
 		if ( parameters.dithering )
 			_programLayers.enable( 14 );
-		if ( parameters.specularIntensityMap )
-			_programLayers.enable( 15 );
-		if ( parameters.specularColorMap )
-			_programLayers.enable( 16 );
 		if ( parameters.transmission )
-			_programLayers.enable( 17 );
-		if ( parameters.transmissionMap )
-			_programLayers.enable( 18 );
-		if ( parameters.thicknessMap )
-			_programLayers.enable( 19 );
+			_programLayers.enable( 15 );
 		if ( parameters.sheen )
-			_programLayers.enable( 20 );
-		if ( parameters.sheenColorMap )
-			_programLayers.enable( 21 );
-		if ( parameters.sheenRoughnessMap )
-			_programLayers.enable( 22 );
+			_programLayers.enable( 16 );
 		if ( parameters.decodeVideoTexture )
-			_programLayers.enable( 23 );
+			_programLayers.enable( 17 );
 		if ( parameters.opaque )
-			_programLayers.enable( 24 );
+			_programLayers.enable( 18 );
 		if ( parameters.pointsUvs )
-			_programLayers.enable( 25 );
+			_programLayers.enable( 19 );
 
 		array.push( _programLayers.mask );
 

+ 3 - 0
src/textures/Texture.js

@@ -36,6 +36,7 @@ class Texture extends EventDispatcher {
 		this.mipmaps = [];
 
 		this.mapping = mapping;
+		this.channel = 0;
 
 		this.wrapS = wrapS;
 		this.wrapT = wrapT;
@@ -110,6 +111,7 @@ class Texture extends EventDispatcher {
 		this.mipmaps = source.mipmaps.slice( 0 );
 
 		this.mapping = source.mapping;
+		this.channel = source.channel;
 
 		this.wrapS = source.wrapS;
 		this.wrapT = source.wrapT;
@@ -169,6 +171,7 @@ class Texture extends EventDispatcher {
 			image: this.source.toJSON( meta ).uuid,
 
 			mapping: this.mapping,
+			channel: this.channel,
 
 			repeat: [ this.repeat.x, this.repeat.y ],
 			offset: [ this.offset.x, this.offset.y ],

Some files were not shown because too many files changed in this diff