Преглед изворни кода

added PMREM prepare methods

Emmett Lalish пре 5 година
родитељ
комит
8749869d0b

Разлика између датотеке није приказан због своје велике величине
+ 8 - 4
build/three.js


Разлика између датотеке није приказан због своје велике величине
+ 6 - 2
build/three.module.js


+ 39 - 0
examples/js/pmrem/PMREMGenerator.js

@@ -65,6 +65,7 @@ THREE.PMREMGenerator = ( function () {
 	var PMREMGenerator = function ( renderer ) {
 
 		_renderer = renderer;
+		_compileMaterial( _blurMaterial );
 
 	};
 
@@ -128,6 +129,36 @@ THREE.PMREMGenerator = ( function () {
 
 		},
 
+		/**
+		 * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
+		 * your texture's network fetch for increased concurrency.
+		 */
+		prepareFromCubemap: function () {
+
+			if ( _cubemapShader == null ) {
+
+				_cubemapShader = _getCubemapShader();
+				_compileMaterial( _cubemapShader );
+
+			}
+
+		},
+
+		/**
+		 * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
+		 * your texture's network fetch for increased concurrency.
+		 */
+		prepareFromEquirectangular: function () {
+
+			if ( _equirectShader == null ) {
+
+				_equirectShader = _getEquirectShader();
+				_compileMaterial( _equirectShader );
+
+			}
+
+		},
+
 		/**
 		 * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,
 		 * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on
@@ -359,6 +390,14 @@ THREE.PMREMGenerator = ( function () {
 
 	}
 
+	function _compileMaterial( material ) {
+
+		var tmpScene = new THREE.Scene();
+		tmpScene.add( new THREE.Mesh( _lodPlanes[ 0 ], material ) );
+		_renderer.compile( tmpScene, _flatCamera );
+
+	}
+
 	function _createRenderTarget( params ) {
 
 		var cubeUVRenderTarget =

+ 2 - 0
examples/jsm/pmrem/PMREMGenerator.d.ts

@@ -12,6 +12,8 @@ export class PMREMGenerator {
 	fromScene( scene:Scene, sigma?:number, near?:number, far?:number ): WebGLRenderTarget;
 	fromEquirectangular( equirectangular:Texture ): WebGLRenderTarget;
 	fromCubemap( cubemap:CubeTexture ): WebGLRenderTarget;
+	prepareFromCubemap(): void;
+	prepareFromEquirectangular(): void;
 	dispose(): void;
 
 }

+ 39 - 0
examples/jsm/pmrem/PMREMGenerator.js

@@ -91,6 +91,7 @@ var PMREMGenerator = ( function () {
 	var PMREMGenerator = function ( renderer ) {
 
 		_renderer = renderer;
+		_compileMaterial( _blurMaterial );
 
 	};
 
@@ -154,6 +155,36 @@ var PMREMGenerator = ( function () {
 
 		},
 
+		/**
+		 * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
+		 * your texture's network fetch for increased concurrency.
+		 */
+		prepareFromCubemap: function () {
+
+			if ( _cubemapShader == null ) {
+
+				_cubemapShader = _getCubemapShader();
+				_compileMaterial( _cubemapShader );
+
+			}
+
+		},
+
+		/**
+		 * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
+		 * your texture's network fetch for increased concurrency.
+		 */
+		prepareFromEquirectangular: function () {
+
+			if ( _equirectShader == null ) {
+
+				_equirectShader = _getEquirectShader();
+				_compileMaterial( _equirectShader );
+
+			}
+
+		},
+
 		/**
 		 * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,
 		 * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on
@@ -385,6 +416,14 @@ var PMREMGenerator = ( function () {
 
 	}
 
+	function _compileMaterial( material ) {
+
+		var tmpScene = new Scene();
+		tmpScene.add( new Mesh( _lodPlanes[ 0 ], material ) );
+		_renderer.compile( tmpScene, _flatCamera );
+
+	}
+
 	function _createRenderTarget( params ) {
 
 		var cubeUVRenderTarget =

+ 3 - 1
examples/webgl_loader_gltf.html

@@ -48,7 +48,6 @@
 					.setPath( 'textures/equirectangular/' )
 					.load( 'pedestrian_overpass_1k.hdr', function ( texture ) {
 
-						var pmremGenerator = new PMREMGenerator( renderer );
 						var envMap = pmremGenerator.fromEquirectangular( texture ).texture;
 						pmremGenerator.dispose();
 
@@ -86,6 +85,9 @@
 				renderer.outputEncoding = THREE.sRGBEncoding;
 				container.appendChild( renderer.domElement );
 
+				var pmremGenerator = new PMREMGenerator( renderer );
+				pmremGenerator.prepareFromEquirectangular();
+
 				controls = new OrbitControls( camera, renderer.domElement );
 				controls.target.set( 0, - 0.2, - 0.2 );
 				controls.update();

+ 6 - 2
src/renderers/webgl/WebGLPrograms.js

@@ -261,9 +261,13 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 
 		}
 
-		for ( var i = 0; i < parameterNames.length; i ++ ) {
+		if ( ! material.isRawShaderMaterial ) {
 
-			array.push( parameters[ parameterNames[ i ] ] );
+			for ( var i = 0; i < parameterNames.length; i ++ ) {
+
+				array.push( parameters[ parameterNames[ i ] ] );
+
+			}
 
 		}
 

Неке датотеке нису приказане због велике количине промена