提交 3c50ca7a 编写于 作者: M Mr.doob

Merge pull request #5208 from henri-astre-msft/uploadTexture

add uploadTexture to WebGLRenderer
...@@ -5610,108 +5610,114 @@ THREE.WebGLRenderer = function ( parameters ) { ...@@ -5610,108 +5610,114 @@ THREE.WebGLRenderer = function ( parameters ) {
}; };
this.setTexture = function ( texture, slot ) { this.uploadTexture = function ( texture ) {
if ( texture.needsUpdate ) { if ( ! texture.__webglInit ) {
if ( ! texture.__webglInit ) { texture.__webglInit = true;
texture.__webglInit = true; texture.addEventListener( 'dispose', onTextureDispose );
texture.addEventListener( 'dispose', onTextureDispose ); texture.__webglTexture = _gl.createTexture();
texture.__webglTexture = _gl.createTexture(); _this.info.memory.textures ++;
_this.info.memory.textures ++; }
} _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
_gl.activeTexture( _gl.TEXTURE0 + slot ); _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture ); _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); var image = texture.image,
_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); glFormat = paramThreeToGL( texture.format ),
glType = paramThreeToGL( texture.type );
var image = texture.image, setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
glFormat = paramThreeToGL( texture.format ),
glType = paramThreeToGL( texture.type );
setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo ); var mipmap, mipmaps = texture.mipmaps;
var mipmap, mipmaps = texture.mipmaps; if ( texture instanceof THREE.DataTexture ) {
if ( texture instanceof THREE.DataTexture ) { // use manually created mipmaps if available
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
// use manually created mipmaps if available if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if ( mipmaps.length > 0 && isImagePowerOfTwo ) { for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { mipmap = mipmaps[ i ];
_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
mipmap = mipmaps[ i ]; }
_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
} texture.generateMipmaps = false;
} else {
texture.generateMipmaps = false; _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
} else { }
} else if ( texture instanceof THREE.CompressedTexture ) {
_gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
mipmap = mipmaps[ i ];
if ( texture.format !== THREE.RGBAFormat ) {
_gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
} else {
_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
} }
} else if ( texture instanceof THREE.CompressedTexture ) { }
} else { // regular Texture (image, video, canvas)
// use manually created mipmaps if available
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
mipmap = mipmaps[ i ]; mipmap = mipmaps[ i ];
if ( texture.format !== THREE.RGBAFormat ) { _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
_gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
} else {
_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
}
} }
} else { // regular Texture (image, video, canvas) texture.generateMipmaps = false;
// use manually created mipmaps if available } else {
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image );
mipmap = mipmaps[ i ]; }
_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
} }
texture.generateMipmaps = false; if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
} else { texture.needsUpdate = false;
_gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image ); if ( texture.onUpdate ) texture.onUpdate();
} };
} this.setTexture = function ( texture, slot ) {
if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); _gl.activeTexture( _gl.TEXTURE0 + slot );
texture.needsUpdate = false; if ( texture.needsUpdate ) {
if ( texture.onUpdate ) texture.onUpdate(); _this.uploadTexture( texture );
} else { } else {
_gl.activeTexture( _gl.TEXTURE0 + slot );
_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture ); _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册