瀏覽代碼

Added doubleSided handling for reflections / refractions.

Not sure it's really correct, it's kinda hard to tell.

Also made stress test more fancy and heavy. It's interesting how antialiasing increases performance difference for more complex materials.
alteredq 13 年之前
父節點
當前提交
382f964255
共有 4 個文件被更改,包括 76 次插入13 次删除
  1. 2 1
      build/Three.js
  2. 2 1
      build/custom/ThreeWebGL.js
  3. 62 10
      examples/webgl_performance_doublesided.html
  4. 10 1
      src/renderers/WebGLShaders.js

File diff suppressed because it is too large
+ 2 - 1
build/Three.js


File diff suppressed because it is too large
+ 2 - 1
build/custom/ThreeWebGL.js


+ 62 - 10
examples/webgl_performance_doublesided.html

@@ -18,22 +18,28 @@
 
 
 		<script src="../build/Three.js"></script>
 		<script src="../build/Three.js"></script>
 
 
+		<script src="js/Detector.js"></script>
 		<script src="js/Stats.js"></script>
 		<script src="js/Stats.js"></script>
 
 
 		<script>
 		<script>
 
 
+			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
+
 			var container, stats;
 			var container, stats;
 
 
 			var camera, scene, renderer;
 			var camera, scene, renderer;
 
 
-			var mesh, zmesh, lightMesh, geometry;
+			var mesh, geometry;
 
 
 			var mouseX = 0, mouseY = 0;
 			var mouseX = 0, mouseY = 0;
 
 
-			var windowHalfX = window.innerWidth / 2;
-			var windowHalfY = window.innerHeight / 2;
+			var SCREEN_WIDTH = window.innerWidth,
+				SCREEN_HEIGHT = window.innerHeight;
+
+			var windowHalfX = SCREEN_WIDTH / 2;
+			var windowHalfY = SCREEN_HEIGHT / 2;
 
 
-			document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+			var FANCY = true;
 
 
 			init();
 			init();
 			animate();
 			animate();
@@ -44,21 +50,46 @@
 				container = document.createElement( 'div' );
 				container = document.createElement( 'div' );
 				document.body.appendChild( container );
 				document.body.appendChild( container );
 
 
-				camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 20000 );
+				camera = new THREE.PerspectiveCamera( 50, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 20000 );
 				camera.position.z = 3200;
 				camera.position.z = 3200;
 
 
 				scene = new THREE.Scene();
 				scene = new THREE.Scene();
 				scene.add( camera );
 				scene.add( camera );
 
 
-				var light = new THREE.PointLight( 0x0011ff, 1, 5000 );
+				var light = new THREE.PointLight( 0x0011ff, 1, 5500 );
 				light.position.set( 4000, 0, 0 );
 				light.position.set( 4000, 0, 0 );
 				scene.add( light );
 				scene.add( light );
 
 
-				var light = new THREE.PointLight( 0xff1100, 1, 5000 );
+				var light = new THREE.PointLight( 0xff1100, 1, 5500 );
 				light.position.set( -4000, 0, 0 );
 				light.position.set( -4000, 0, 0 );
 				scene.add( light );
 				scene.add( light );
 
 
-				var material = new THREE.MeshPhongMaterial( { specular: 0xffffff, shading: THREE.SmoothShading, perPixel: true } );
+				if ( FANCY ) {
+
+					var light = new THREE.PointLight( 0xffaa00, 2, 3000 );
+					light.position.set( 0, 0, 0 );
+					scene.add( light );
+
+					var path = "textures/cube/SwedishRoyalCastle/";
+					var format = '.jpg';
+					var urls = [
+							path + 'px' + format, path + 'nx' + format,
+							path + 'py' + format, path + 'ny' + format,
+							path + 'pz' + format, path + 'nz' + format
+						];
+
+					var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
+					reflectionCube.format = THREE.RGBFormat;
+
+					var material = new THREE.MeshPhongMaterial( { specular: 0xffffff, shininess: 100, envMap: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.1, perPixel: true } );
+					material.wrapAround = true;
+					material.wrapRGB.set( 0.5, 0.5, 0.5 );
+
+				} else {
+
+					var material = new THREE.MeshPhongMaterial( { specular: 0xffffff, shading: THREE.SmoothShading, perPixel: true } );
+
+				}
 
 
 				var geometry = new THREE.SphereGeometry( 1, 32, 16, 0, Math.PI );
 				var geometry = new THREE.SphereGeometry( 1, 32, 16, 0, Math.PI );
 
 
@@ -83,12 +114,13 @@
 
 
 				}
 				}
 
 
-				renderer = new THREE.WebGLRenderer( { clearColor: 0x050505, clearAlpha: 1, antialias: false } );
-				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer = new THREE.WebGLRenderer( { clearColor: 0x050505, clearAlpha: 1, antialias: FANCY } );
+				renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
 				renderer.sortObjects = false;
 				renderer.sortObjects = false;
 
 
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
+				renderer.physicallyBasedShading = FANCY;
 
 
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 
@@ -103,6 +135,26 @@
 
 
 				container.appendChild( stats.domElement );
 				container.appendChild( stats.domElement );
 
 
+				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			//
+
+			function onWindowResize( event ) {
+
+				SCREEN_WIDTH = window.innerWidth;
+				SCREEN_HEIGHT = window.innerHeight;
+
+				renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
+
+				camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
+				camera.updateProjectionMatrix();
+
+				windowHalfX = SCREEN_WIDTH / 2;
+				windowHalfY = SCREEN_HEIGHT / 2;
+
 			}
 			}
 
 
 			function onDocumentMouseMove(event) {
 			function onDocumentMouseMove(event) {

+ 10 - 1
src/renderers/WebGLShaders.js

@@ -74,7 +74,16 @@ THREE.ShaderChunk = {
 
 
 		"#ifdef USE_ENVMAP",
 		"#ifdef USE_ENVMAP",
 
 
-			"vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );",
+			"#ifdef DOUBLE_SIDED",
+
+				"float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
+				"vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );",
+
+			"#else",
+
+				"vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );",
+
+			"#endif",
 
 
 			"#ifdef GAMMA_INPUT",
 			"#ifdef GAMMA_INPUT",
 
 

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