فهرست منبع

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

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 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="js/Detector.js"></script>
 		<script src="js/Stats.js"></script>
 
 		<script>
 
+			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
+
 			var container, stats;
 
 			var camera, scene, renderer;
 
-			var mesh, zmesh, lightMesh, geometry;
+			var mesh, geometry;
 
 			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();
 			animate();
@@ -44,21 +50,46 @@
 				container = document.createElement( 'div' );
 				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;
 
 				scene = new THREE.Scene();
 				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 );
 				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 );
 				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 );
 
@@ -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.gammaInput = true;
 				renderer.gammaOutput = true;
+				renderer.physicallyBasedShading = FANCY;
 
 				container.appendChild( renderer.domElement );
 
@@ -103,6 +135,26 @@
 
 				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) {

+ 10 - 1
src/renderers/WebGLShaders.js

@@ -74,7 +74,16 @@ THREE.ShaderChunk = {
 
 		"#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",
 

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است