提交 bd32d237 编写于 作者: R Richard Monette

fix NPOT issues

上级 fe88567d
......@@ -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
......
......@@ -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 );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册