浏览代码

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 14 年之前
父节点
当前提交
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

文件差异内容过多而无法显示
+ 2 - 1
build/Three.js


文件差异内容过多而无法显示
+ 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",
 
 

部分文件因为文件数量过多而无法显示