瀏覽代碼

fix NPOT issues

Richard Monette 7 年之前
父節點
當前提交
bd32d237fd

+ 10 - 6
examples/js/loaders/EXRLoader.js

@@ -294,7 +294,11 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 	// we should be passed the scanline offset table, start reading pixel data
 
-	var byteArray = new Float32Array( EXRHeader.dataWindow.xMax * EXRHeader.dataWindow.yMax * 4 );
+	var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1;
+	var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1;
+	var numChannels = EXRHeader.channels.length;
+
+	var byteArray = new Float32Array( width * height * numChannels );
 
 	var channelOffsets = {
 		R: 0,
@@ -303,7 +307,7 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 		A: 3
 	};
 
-	for ( var y = 0; y < EXRHeader.dataWindow.yMax + 1; y ++ ) {
+	for ( var y = 0; y < height; y ++ ) {
 
 		var y_scanline = parseUint32( buffer, offset );
 		var dataSize = parseUint32( buffer, offset );
@@ -311,12 +315,12 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 		for ( var channelID = 0; channelID < EXRHeader.channels.length; channelID ++ ) {
 			if ( EXRHeader.channels[ channelID ].pixelType == 1 ) {
 			 // HALF
-				for ( var x = 0; x < EXRHeader.dataWindow.xMax + 1; x ++ ) {
+				for ( var x = 0; x < width; x ++ ) {
 
 					var val = parseFloat16( buffer, offset );
 					var cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];
 
-					byteArray[ ( ( ( EXRHeader.dataWindow.yMax - y_scanline ) * ( EXRHeader.dataWindow.xMax * 4 ) ) + ( x * 4 ) ) + cOff ] = val;
+					byteArray[ ( ( ( width - y_scanline ) * ( height * numChannels ) ) + ( x * numChannels ) ) + cOff ] = val;
 
 				}
 
@@ -332,8 +336,8 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 	return {
 		header: EXRHeader,
-		width: EXRHeader.dataWindow.xMax,
-		height: EXRHeader.dataWindow.yMax,
+		width: width,
+		height: height,
 		data: byteArray,
 		format: THREE.RGBAFormat,
 		type: THREE.FloatType

二進制
examples/textures/latlng_env_uncompressed.exr


二進制
examples/textures/uncompressed.exr


+ 19 - 31
examples/webgl_materials_texture_exr.html

@@ -39,6 +39,8 @@
 		<script src="../build/three.js"></script>
 		<script src="js/loaders/EXRLoader.js"></script>
 
+		<script src="js/libs/dat.gui.min.js"></script>
+
 		<script src="js/Detector.js"></script>
 		<script src="js/libs/stats.min.js"></script>
 
@@ -58,7 +60,7 @@
 
 				// Perform tone-mapping
 				float Y = dot(vec4(0.30, 0.59, 0.11, 0.0), color);
-				float YD = exposure * (exposure/brightMax + 1.0) / (exposure + 1.0);
+				float YD = exposure * (exposure / brightMax + 1.0) / (exposure + 1.0);
 				color *= YD;
 
 				gl_FragColor = vec4( color.xyz, 1.0 );
@@ -85,6 +87,10 @@
 
 		<script>
 
+			var params = {
+				exposure: 1.0,
+			};
+
 			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
 
 			var container, stats;
@@ -92,10 +98,6 @@
 			var camera, scene, renderer;
 			var materialHDR, quad, gamma, exposure;
 
-			var sign = 1, rate = 1;
-
-			var clock = new THREE.Clock();
-
 			init();
 
 			function init() {
@@ -109,15 +111,18 @@
 
 				var loader = new THREE.EXRLoader();
 
-				var texture = loader.load( "textures/latlng_env_uncompressed.exr", function( texture, textureData ){
+				var texture = loader.load( "textures/uncompressed.exr", function( texture, textureData ){
 					console.log( textureData.header ); // exr header
 
+					texture.minFilter = THREE.NearestFilter;
+					texture.magFilter = THREE.NearestFilter;
+
 					materialHDR = new THREE.ShaderMaterial( {
 
 						uniforms: {
 							tDiffuse:  { value: texture },
 							exposure:  { value: 1.0 },
-							brightMax: { value: 20.0 }
+							brightMax: { value: 18.0 }
 							},
 						vertexShader: getText( 'vs-hdr' ),
 						fragmentShader: getText( 'fs-hdr' )
@@ -129,22 +134,23 @@
 					scene.add( quad );
 					animate();
 				} );
-				texture.minFilter = THREE.LinearFilter;
-				texture.magFilter = THREE.NearestFilter;
-
 
 				renderer = new THREE.WebGLRenderer();
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.gammaOutput = true;
 				container.appendChild( renderer.domElement );
 
 				stats = new Stats();
 				container.appendChild( stats.dom );
 
-				//
-
 				window.addEventListener( 'resize', onWindowResize, false );
 
+				var gui = new dat.GUI();
+
+				gui.add( params, 'exposure', 0.1, 5 );
+				gui.open();
+
 			}
 
 
@@ -177,25 +183,7 @@
 
 			function render() {
 
-				var delta = clock.getDelta() * 5;
-
-				if ( materialHDR.uniforms.exposure.value > 0 || materialHDR.uniforms.exposure.value < 1 ) {
-
-					rate = 0.25;
-
-				} else {
-
-					rate = 1;
-
-				}
-
-				if ( materialHDR.uniforms.exposure.value > 5 || materialHDR.uniforms.exposure.value <= 0 ) {
-
-					sign *= -1;
-
-				}
-
-				materialHDR.uniforms.exposure.value += sign * rate * delta;
+				materialHDR.uniforms.exposure.value = params.exposure;
 
 				renderer.render( scene, camera );