未验证 提交 ea8a35d5 编写于 作者: M Mr.doob 提交者: GitHub

Merge pull request #17887 from dialoguetrainer/exr_loader_rgba

EXRLoader: Fix for Firefox by only returning RGBA textures
...@@ -1150,18 +1150,36 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade ...@@ -1150,18 +1150,36 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade
var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1; var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1;
var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1; var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1;
var numChannels = EXRHeader.channels.length; // Firefox only supports RGBA (half) float textures
// var numChannels = EXRHeader.channels.length;
var numChannels = 4;
var size = width * height * numChannels;
// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten
switch ( this.type ) { switch ( this.type ) {
case THREE.FloatType: case THREE.FloatType:
var byteArray = new Float32Array( width * height * numChannels ); var byteArray = new Float32Array( size );
if ( EXRHeader.channels.length < numChannels ) {
byteArray.fill( 1, 0, size );
}
break; break;
case THREE.HalfFloatType: case THREE.HalfFloatType:
var byteArray = new Uint16Array( width * height * numChannels ); var byteArray = new Uint16Array( size );
if ( EXRHeader.channels.length < numChannels ) {
byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1
}
break; break;
default: default:
...@@ -1232,7 +1250,7 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade ...@@ -1232,7 +1250,7 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade
var tmpBuffer = new Uint16Array( tmpBufferSize ); var tmpBuffer = new Uint16Array( tmpBufferSize );
var tmpOffset = { value: 0 }; var tmpOffset = { value: 0 };
decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, numChannels, EXRHeader.channels, width, scanlineBlockSize ); decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, EXRHeader.channels.length, EXRHeader.channels, width, scanlineBlockSize );
for ( var line_y = 0; line_y < scanlineBlockSize; line_y ++ ) { for ( var line_y = 0; line_y < scanlineBlockSize; line_y ++ ) {
...@@ -1359,7 +1377,7 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade ...@@ -1359,7 +1377,7 @@ THREE.EXRLoader.prototype = Object.assign( Object.create( THREE.DataTextureLoade
width: width, width: width,
height: height, height: height,
data: byteArray, data: byteArray,
format: EXRHeader.channels.length == 4 ? THREE.RGBAFormat : THREE.RGBFormat, format: numChannels == 4 ? THREE.RGBAFormat : THREE.RGBFormat,
type: this.type type: this.type
}; };
......
...@@ -1161,18 +1161,36 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype ...@@ -1161,18 +1161,36 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype
var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1; var width = EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1;
var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1; var height = EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1;
var numChannels = EXRHeader.channels.length; // Firefox only supports RGBA (half) float textures
// var numChannels = EXRHeader.channels.length;
var numChannels = 4;
var size = width * height * numChannels;
// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten
switch ( this.type ) { switch ( this.type ) {
case FloatType: case FloatType:
var byteArray = new Float32Array( width * height * numChannels ); var byteArray = new Float32Array( size );
if ( EXRHeader.channels.length < numChannels ) {
byteArray.fill( 1, 0, size );
}
break; break;
case HalfFloatType: case HalfFloatType:
var byteArray = new Uint16Array( width * height * numChannels ); var byteArray = new Uint16Array( size );
if ( EXRHeader.channels.length < numChannels ) {
byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1
}
break; break;
default: default:
...@@ -1243,7 +1261,7 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype ...@@ -1243,7 +1261,7 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype
var tmpBuffer = new Uint16Array( tmpBufferSize ); var tmpBuffer = new Uint16Array( tmpBufferSize );
var tmpOffset = { value: 0 }; var tmpOffset = { value: 0 };
decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, numChannels, EXRHeader.channels, width, scanlineBlockSize ); decompressPIZ( tmpBuffer, tmpOffset, uInt8Array, bufferDataView, offset, tmpBufferSize, EXRHeader.channels.length, EXRHeader.channels, width, scanlineBlockSize );
for ( var line_y = 0; line_y < scanlineBlockSize; line_y ++ ) { for ( var line_y = 0; line_y < scanlineBlockSize; line_y ++ ) {
...@@ -1370,7 +1388,7 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype ...@@ -1370,7 +1388,7 @@ EXRLoader.prototype = Object.assign( Object.create( DataTextureLoader.prototype
width: width, width: width,
height: height, height: height,
data: byteArray, data: byteArray,
format: EXRHeader.channels.length == 4 ? RGBAFormat : RGBFormat, format: numChannels == 4 ? RGBAFormat : RGBFormat,
type: this.type type: this.type
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册