three.js 原始碼註釋(三十四)Texture/Texture.js
阿新 • • 發佈:2019-02-17
俺也是剛開始學,好多地兒肯定不對還請見諒.
以下程式碼是THREE.JS 原始碼檔案中Texture/Texture.js檔案的註釋.
/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author szimek / https://github.com/szimek/ */ /* ///Texture類用來為面建立一個反射折射或者紋理貼圖物件 /// 這個類是最重要的屬性是image,這是一個JavaScript Image型別物件。傳入的第一個引數就是該物件, ///後面的物件都是可選的,如果預設就會填充預設值,而且往往都是填充預設值。 ///屬性magFileter和minFileter指定紋理在放大和縮小時的過濾方式:最臨近點、雙線性內插等。 ///從url中生成一個texture,需要呼叫Three.ImageUtils.loadTexture(paras), ///該函式返回一個texture型別物件。在函式內部又呼叫了THREE.ImageLoader.load(paras)函式,這個函式內部又呼叫了THREE.Texture()建構函式,生成紋理。 /// /// ///Example // load a texture, set wrap mode to repeat var texture = THREE.ImageUtils.loadTexture( "textures/water.jpg" ); texture.wrapS = THREE.RepeatWrapping; texture.wrapT = THREE.RepeatWrapping; texture.repeat.set( 4, 4 ); /// */ ///<summary>Texture</summary> ///<param name ="image" type="Image">JavaScript Image型別物件</param> ///<param name ="mapping" type="Number">對映模式,可用常量參考下面註釋</param> ///<param name ="wrapS" type="Number">S方向覆蓋模式,可用常量參考下面註釋</param> ///<param name ="wrapT" type="Number">T方向覆蓋模式,可用常量參考下面註釋</param> ///<param name ="magFilter" type="Number">紋理在放大時的過濾方式,可用常量參考下面註釋</param> ///<param name ="minFilter" type="Number">紋理在縮小時的過濾方式,可用常量參考下面註釋</param> ///<param name ="format" type="Number">畫素資料的顏色格式,可用常量參考下面註釋</param> ///<param name ="type" type="Number">資料型別,預設為不帶符號8位整形值</param> ///<param name ="anisotropy" type="Float">各向異性,取值範圍0.0-1.0,經常用來通過這個值,產生不同的表面效果,木材和金屬都發光,但是發光的特點是有區別的.</param> ///<returns type="Texture">返回建立的紋理物件</returns> THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { this.id = THREE.TextureIdCount ++; //紋理屬性id this.uuid = THREE.Math.generateUUID(); //紋理uuid(通用唯一標識碼)屬性 this.name = ''; //紋理名稱屬性,可有可無 this.image = image !== undefined ? image : THREE.Texture.DEFAULT_IMAGE; //紋理的圖片,最重要的屬性是image,這是一個JavaScript Image型別物件。 /* Mipmap 在三維世界中,顯示一張圖的大小與攝象機的位置有關,近的地方,圖片實際象素就大一些,遠的地方圖片實際象 素就會小一些,就要進行一些壓縮,例如一張64*64的圖,在近處,顯示出來可能是50*50,在遠處可能顯示出來是20*20. 如果只限於簡單的支掉某些畫素,將會使縮小後的圖片損失很多細節,圖片變得很粗糙,因此,圖形學有很多複雜的方 法來處理縮小圖片的問題,使得縮小後的圖片依然清晰,然而,這些計算都會耗費一定的時間. Mipmap紋理技術是目前解決紋理解析度與視點距離關係的最有效途徑,它會先將圖片壓縮成很多逐漸縮小的圖片, 例如一張64*64的圖片,會產生64*64,32*32,16*16,8*8,4*4,2*2,1*1的7張圖片,當螢幕上需要繪製畫素點為20*20 時, 程式只是利用 32*32 和 16*16 這兩張圖片來計算出即將顯示為 20*20 大小的一個圖片,這比單獨利用 32*32 的 那張原始片計算出來的圖片效果要好得多,速度也更快. 參考:http://zh.wikipedia.org/wiki/Mipmap 參考:http://staff.cs.psu.ac.th/iew/cs344-481/p1-williams.pdf 參考:http://blog.csdn.net/linber214/article/details/3342051 */ this.mipmaps = []; //存放mipmaps的屬性陣列 this.mapping = mapping !== undefined ? mapping : THREE.Texture.DEFAULT_MAPPING; //對映模式,有THREE.UVMapping平展對映,THREE.CubeReflectionMapping 立方體反射對映,THREE.CubeRefractionMapping立方體折射對映,THREE.SphericalReflectionMapping球面反射對映,THREE.SphericalRefractionMapping球面折射對映. //關於紋理s方向,t方向參考http://blog.csdn.net/kylaoshu364/article/details/5608851 this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping; //S方向覆蓋模式,預設為THREE.ClampToEdgeWrapping,(夾取),超過1.0的值被固定為1.0。超過1.0的其它地方的紋理,沿用最後畫素的紋理。用於當疊加過濾時,需要從0.0到1.0精確覆蓋且沒有模糊邊界的紋理。 //還有THREE.RepeatWrapping(重複)和THREE.MirroredRepeatWrapping(映象) this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping; //T方向覆蓋模式,預設為THREE.ClampToEdgeWrapping,(夾取),超過1.0的值被固定為1.0。超過1.0的其它地方的紋理,沿用最後畫素的紋理。用於當疊加過濾時,需要從0.0到1.0精確覆蓋且沒有模糊邊界的紋理。 //還有THREE.RepeatWrapping(重複)和THREE.MirroredRepeatWrapping(映象) /* 紋素 紋素(英語:Texel,即texture element或texture pixel的合成字)是紋理元素的簡稱,它是計算機圖形紋理空間中的基本單元[1]。如同影象是由畫素排列而成,紋理是由紋素排列表示的。 紋素可以由影象範圍來定義,其範圍可以通過一些簡單的方法來獲取,比如閥值。沃羅諾伊分佈可以用來描述紋素之間的空間關係。這就意味著我們可以通過將紋素與其周圍的紋素圖心的連線的垂直平分線將整個紋理分割成連續的多邊形。結果就是每一個紋素圖心都會有一個沃羅諾伊多邊形將其圈起來。 在對三維表面鋪設紋理的時候,通過紋理對映技術將紋素對映到恰當的輸出影象畫素上。在當今的計算機上,這個過程主要是由圖形卡完成的。 紋理工序起始於空間中的某一位置。這個位置可以是在世界座標系中,但是一般情況下會設定在物體座標系中。這樣紋理會隨著物體運動。然後通過投射的方式將其位置(座標)從三維向量值轉化為0到1範圍的二維向量值(即uv)。再將這個二維向量值與紋理的解析度相乘從而獲得紋素的位置。 當所需紋素的位置不是整數的時候,需要使用紋理濾鏡進行處理。 // 紋理在放大或縮小時的過濾方式,過濾方式,有THREE.NearestFilter在紋理基層上執行最鄰近過濾, //THREE.NearestMipMapNearestFilter在mip層之間執行線性插補,並執行最臨近的過濾, //THREE.NearestMipMapLinearFilter選擇最臨近的mip層,並執行最臨近的過濾, //THREE.LinearFilter在紋理基層上執行線性過濾 //THREE.LinearMipMapNearestFilter選擇最臨近的mip層,並執行線性過濾, //THREE.LinearMipMapLinearFilter在mip層之間執行線性插補,並執行線性過濾 參考:http://blog.csdn.net/kkk328/article/details/7055934 參考:http://xiaxveliang.blog.163.com/blog/static/297080342013467552467/ */ this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter; //紋理在放大時的過濾方式,THREE.LinearFilter在紋理基層上執行線性過濾 this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter; //紋理在縮小時的過濾方式,THREE.LinearMipMapNearestFilter選擇最臨近的mip層,並執行線性過濾 this.anisotropy = anisotropy !== undefined ? anisotropy : 1; //各向異性,取值範圍0.0-1.0,經常用來通過這個值,產生不同的表面效果,木材和金屬都發光,但是發光的特點是有區別的. /************************************************************************* 引數 format 定義了影象資料陣列 texels 中的格式。可以取值如下: 影象資料陣列 texels 格式 格式 註解 GL_COLOR_INDEX 顏色索引值 GL_DEPTH_COMPONENT 深度值 GL_RED 紅色畫素值 GL_GREEN 綠色畫素值 GL_BLUE 藍色畫素值 GL_ALPHA Alpha 值 GL_RGB Red, Green, Blue 三原色值 GL_RGBA Red, Green, Blue 和 Alpha 值 GL_BGR Blue, Green, Red 值 GL_BGRA Blue, Green, Red 和 Alpha 值 GL_LUMINANCE 灰度值 GL_LUMINANCE_ALPHA 灰度值和 Alpha 值 *************************************************************************/ this.format = format !== undefined ? format : THREE.RGBAFormat; //畫素資料的顏色格式, 預設為THREE.RGBAFormat,還有以下可選引數 //THREE.AlphaFormat = 1019; //GL_ALPHA Alpha 值 //THREE.RGBFormat = 1020; //Red, Green, Blue 三原色值 //THREE.RGBAFormat = 1021; //Red, Green, Blue 和 Alpha 值 //THREE.LuminanceFormat = 1022; //灰度值 //THREE.LuminanceAlphaFormat = 1023; //灰度值和 Alpha 值 /************************************************************************************** 引數 type 定義了影象資料陣列 texels 中的資料型別。可取值如下 影象資料陣列 texels 中資料型別 資料型別 註解 GL_BITMAP 一位(0或1) GL_BYTE 帶符號8位整形值(一個位元組) GL_UNSIGNED_BYTE 不帶符號8位整形值(一個位元組) GL_SHORT 帶符號16位整形值(2個位元組) GL_UNSIGNED_SHORT 不帶符號16未整形值(2個位元組) GL_INT 帶符號32位整形值(4個位元組) GL_UNSIGNED_INT 不帶符號32位整形值(4個位元組) GL_FLOAT 單精度浮點型(4個位元組) GL_UNSIGNED_BYTE_3_3_2 壓縮到不帶符號8位整形:R3,G3,B2 GL_UNSIGNED_BYTE_2__3_REV 壓縮到不帶符號8位整形:B2,G3,R3 GL_UNSIGNED_SHORT_5_6_5 壓縮到不帶符號16位整形:R5,G6,B5 GL_UNSIGNED_SHORT_5_6_5_REV 壓縮到不帶符號16位整形:B5,G6,R5 GL_UNSIGNED_SHORT_4_4_4_4 壓縮到不帶符號16位整形:R4,G4,B4,A4 GL_UNSIGNED_SHORT_4_4_4_4_REV 壓縮到不帶符號16位整形:A4,B4,G4,R4 GL_UNSIGNED_SHORT_5_5_5_1 壓縮到不帶符號16位整形:R5,G5,B5,A1 GL_UNSIGNED_SHORT_1_5_5_5_REV 壓縮到不帶符號16位整形:A1,B5,G5,R5 GL_UNSIGNED_INT_8_8_8_8 壓縮到不帶符號32位整形:R8,G8,B8,A8 GL_UNSIGNED_INT_8_8_8_8_REV 壓縮到不帶符號32位整形:A8,B8,G8,R8 GL_UNSIGNED_INT_10_10_10_2 壓縮到32位整形:R10,G10,B10,A2 GL_UNSIGNED_INT_2_10_10_10_REV 壓縮到32位整形:A2,B10,G10,R10 你可能會注意到有壓縮型別, 先看看 GL_UNSIGNED_BYTE_3_3_2, 所有的 red, green 和 blue 被組合成一個不帶符號的8位整形中, 在 GL_UNSIGNED_SHORT_4_4_4_4 中是把 red, green , blue 和 alpha 值打包成一個不帶符號的 short 型別。 *************************************************************************************************/ /*******************************************S3TC壓縮紋理格式*************************************************************************************************** 參考:http://www.opengpu.org/forum.php?mod=viewthread&tid=1010 S3TC=DXTC 使用S3TC格式儲存的壓縮紋理是以4X4的紋理單元塊(texel blocks)為基本單位儲存的,每紋理單元塊(texel blocks)有64bit或者128bit的紋理資料(texel data)。 這樣就要求每張貼圖長度和寬度應該是4的倍數。影象如同一般的做法按照行列順序存放這些4X4的紋理單元塊(texel blocks),每個texel blocks被看成是一個影象的“畫素”。 對於那些長度不為4的倍數的貼圖,多出來的那些紋理單元在壓縮的時候都不會被放到影象中。(另外一種說法是不足4的會被補上空位按4處理,Nvidia的Photoshop DDS外掛 不允許這樣的影象被儲存為DXT格式) 對於一個長度為w,寬為h,並且塊大小為blocksize的影象,它的大小為(用位元組計算) ceil(w/4) * ceil(h/4) * blocksize 在解碼一個S3TC影象的時候,可以通過下面的式子得到一個紋理單元(x,y)所位於的塊的地址(用位元組計算) blocksize * (ceil(w/4) * floor(y/3) + floor(x/4)) 通過紋理單元(x,y)獲得它所處於的塊的下標: (x % 4 , y % 4) 有4種不同的S3TC影象格式: 1.COMPRESSED_RGB_S3TC_DXT1_EXT 每個4X4的紋理單元塊包含8個位元組的RGB資料,也就是說每個影象塊被編碼為順序的8個位元組(64bit),按照地址的順序,它們分別是: c0_lo,c0_hi, c1_lo,c1_hi, bits_0,bits_1,bits_2,bits_3 塊的8個位元組被用來表達3個量: color0 = c0_lo + c0_hi * 256 color1 = c1_lo + c1_hi * 256 bits = bits_0 + 256 * (bits_1 + 256 * (bits_2 + 256 * bits_3)) color0和color1是16位的無符號整數,用來表達顏色,格式是RGB - UNSIGNED_SHORT_5_6_5。分別用RGB0和RGB1來表示 bits是一個32位的無符號整數,從bits可以求出位於(x,y)的紋理單元的2位控制碼:(x,y介於0-3之間) code(x,y) = bits[2 * (4 * y + x) + 1..2 * (4 * y + x) + 0] 即,2 * (4 * y + x) + 1位和2 * (4 * y + x)位 bits的第31位是高位,第0位是低位 這樣可以求出位於(x,y)的紋理單元的RGB值: RGB0, if color0 > color1 and code(x,y) == 0 RGB1, if color0 > color1 and code(x,y) == 1 (2*RGB0+RGB1)/3, if color0 > color1 and code(x,y) == 2 (RGB0+2*RGB1)/3, if color0 > color1 and code(x,y) == 3 RGB0, if color0 <= color1 and code(x,y) == 0 RGB1, if color0 <= color1 and code(x,y) == 1 (RGB0+RGB1)/2, if color0 <= color1 and code(x,y) == 2 BLACK, if color0 <= color1 and code(x,y) == 3 這些算術運算都是向量運算,分別對各個分量R,G,B進行計算。BLACK=RGB(0,0,0) 這種格式的S3TC影象不含有Alpha,所以整個影象都是不透明的 2.COMPRESSED_RGBA_S3TC_DXT1_EXT 每個4*4塊包含8位元組的RGB顏色和最小限度的Alpha透明度資料,顏色資料的提取方式和COMPRESSED_RGB_S3TC_DXT1_EXT是完全一樣的,區別在於Alpha資料: 對於(x,y)處紋理單元的Alpha值,計算方式如下: 0.0, if color0 <= color1 and code(x,y) == 3 1.0, otherwise 注意: 首先,把一個RGBA影象壓縮成為只含有1位Alpha的壓縮格式,所有Alpha<0.5的畫素的Alpha值被置為0.0,而Alpha>=0.5的畫素的Alpha值被置為1.0. 而把一個RGBA影象壓縮成為COMPRESSED_RGBA_S3TC_DXT1_EXT格式的時候。 其次,如果某個紋理單元最終的Alpha為0.0,那麼此紋理單元的R,G,B顏色值都將被置為0. 最後,對於是用此格式的應用,必須遵守這個規則。另外,當一個通用的內部格式被指定後,也許可以使用COMPRESSED_RGB_S3TC_DXT1_EXT格式, 但不允許使用COMPRESSED_RGBA_S3TC_DXT1_EXT(應該跟OpenGL有關係) 3.COMPRESSED_RGBA_S3TC_DXT3_EXT 每個4*4塊中包含64bit的未壓縮Alpha資料和64bit的RGB顏色資料,其中顏色資料按照和COMPRESSED_RGB_S3TC_DXT1_EXT一樣的方式編碼, 唯一的區別在於2位控制碼被以不明顯的方式編碼,換句話說,就像知道Color0 > Color1,而不需要知道Color0和Color1的具體值。 每個塊的紋理單元的Alpha值被順次編碼為8個位元組: a0, a1, a2, a3, a4, a5, a6, a7 通過這8個位元組可以得到一個64位的無符號整數: alpha = a0 + 256 * (a1 + 256 * (a2 + 256 * (a3 + 256 * (a4 + 256 * (a5 + 256 * (a6 + 256 * a7)))))) 高位是63位,低位是0位 通過這個alpha就可以獲得位於(x,y)處紋理單元的Alpha值 alpha(x,y) = bits[4*(4*y+x)+3..4*(4*y+x)+0] 4位數字所能表示的最大值是15,所以折算到[0.0,1.0],Alpha = alpha(x,y) / 15 4.COMPRESSED_RGBA_S3TC_DXT5_EXT 每個4*4塊中包含64bit的壓縮過的Alpha資料和64bit的RGB顏色資料,顏色資料部分壓縮方式和COMPRESSED_RGBA_S3TC_DXT3_EXT完全一致。 Alpha資料是8個位元組的壓縮資料,這8個位元組: alpha0, alpha1, bits_0, bits_1, bits_2, bits_3, bits_4, bits_5 其中alpha0和alpha1為unsigned char型別資料,轉化為實際的Alpha值需要乘上 1 / 255.0 其他的6個數字bits_N,則可以被解碼成為一個48位的無符號整數 bits = bits_0 + 256 * (bits_1 + 256 * (bits_2 + 256 * (bits_3 + 256 * (bits_4 + 256 * bits_5)))) 通過bits(高位47低位0),可以求得位於(x,y)紋理單元的3位控制碼: code(x,y) = bits[3*(4*y+x)+1..3*(4*y+x)+0] 根據bits、code(x,y)、alpha0以及alpha1就可以求得(x,y)處紋理單元的Alpha值: alpha0, code(x,y) == 0 alpha1, code(x,y) == 1 (6*alpha0 + 1*alpha1)/7, alpha0 > alpha1 and code(x,y) == 2 (5*alpha0 + 2*alpha1)/7, alpha0 > alpha1 and code(x,y) == 3 (4*alpha0 + 3*alpha1)/7, alpha0 > alpha1 and code(x,y) == 4 (3*alpha0 + 4*alpha1)/7, alpha0 > alpha1 and code(x,y) == 5 (2*alpha0 + 5*alpha1)/7, alpha0 > alpha1 and code(x,y) == 6 (1*alpha0 + 6*alpha1)/7, alpha0 > alpha1 and code(x,y) == 7 (4*alpha0 + 1*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 2 (3*alpha0 + 2*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 3 (2*alpha0 + 3*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 4 (1*alpha0 + 4*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 5 0.0, alpha0 <= alpha1 and code(x,y) == 6 1.0, alpha0 <= alpha1 and code(x,y) == 7 *******************************************S3TC壓縮紋理格式****************************************************************************************************/ this.type = type !== undefined ? type : THREE.UnsignedByteType; //資料型別,預設為不帶符號8位整形值(一個位元組)THREE.UnsignedByteType,還有以下可選引數還支援S3TC紋理壓縮格式. //THREE.UnsignedByteType = 1009; //不帶符號8位整形值(一個位元組) //THREE.ByteType = 1010; //帶符號8位整形值(一個位元組) //THREE.ShortType = 1011; //帶符號16位整形值(2個位元組) //THREE.UnsignedShortType = 1012; //不帶符號16未整形值(2個位元組) //THREE.IntType = 1013; //帶符號32位整形值(4個位元組) //THREE.UnsignedIntType = 1014; //不帶符號32位整形值(4個位元組) //THREE.FloatType = 1015; //單精度浮點型(4個位元組) //THREE.UnsignedByteType = 1009; //不帶符號8位整形值(一個位元組) //THREE.UnsignedShort4444Type = 1016; //壓縮到不帶符號16位整形:R4,G4,B4,A4 //THREE.UnsignedShort5551Type = 1017; //壓縮到不帶符號16位整形:R5,G5,B5,A1 //THREE.UnsignedShort565Type = 1018; //壓縮到不帶符號16位整形:R5,G6,B5 // THREE.RGB_S3TC_DXT1_Format = 2001; //不帶alpha通道的壓縮顏色格式 // THREE.RGBA_S3TC_DXT1_Format = 2002; //只含有1位alpha通道的壓縮顏色格式 // THREE.RGBA_S3TC_DXT3_Format = 2003; //含有類為控制碼alpha通道的壓縮顏色格式 // THREE.RGBA_S3TC_DXT5_Format = 2004; //含有8個位元組的alpha通道的壓縮顏色格式 this.offset = new THREE.Vector2( 0, 0 ); //偏移值 this.repeat = new THREE.Vector2( 1, 1 ); //重複值 this.generateMipmaps = true; //是否生成Mipmaps,預設為true this.premultiplyAlpha = false; //預乘Alpha值,如果設定為true,紋素的rgb值會先乘以alpha值,然後在儲存. this.flipY = true; //文理是否需要垂直翻轉,預設為false this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) // 預設值是4。指定用於在記憶體中的每個畫素行開始校準要求。 // 允許的值是1(位元組對齊),2(行對齊,偶數字節),4(對齊),和8(行開始在雙字的邊界)。更多資訊見glpixelstorei。 //http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml this._needsUpdate = false; //當設定為true時,標記文理已經更新. this.onUpdate = null; //用於指定回撥函式,當文理更新時,執行回撥函式. //TODO: this.onUpdate用法有時間試驗一下 }; THREE.Texture.DEFAULT_IMAGE = undefined; //預設紋理圖片 THREE.Texture.DEFAULT_MAPPING = new THREE.UVMapping(); //預設紋理貼圖對映方式. /**************************************** ****下面是Texture物件提供的功能函式. ****************************************/ THREE.Texture.prototype = { constructor: THREE.Texture, //構造器,返回對建立此物件的Texture函式的引用 /* ///get needsUpdate 方法用來獲得紋理物件是否需要更新標記的值 ///NOTE: get needsUpdate()的用法是Quaternion.prototype.needsUpdate,這種用法在除ie瀏覽器以外的瀏覽器上可以使用. */ ///<summary>get needsUpdate</summary> ///<returns type="Boolean">返回紋理物件是否需要更新標記的值</returns> get needsUpdate () { // return this._needsUpdate; }, /* ///get needsUpdate 方法用來通過設定紋理物件是否需要更新標記的值(引數value),跟新紋理物件. ///NOTE: get needsUpdate()的用法是Quaternion.prototype.needsUpdate,這種用法在除ie瀏覽器以外的瀏覽器上可以使用. */ ///<summary>get needsUpdate</summary> ///<param name ="value" type="Boolean">true 或者 false</param> ///<returns type="Texture">返回更新後的紋理物件.</returns> set needsUpdate ( value ) { if ( value === true ) this.update(); //更新紋理物件 this._needsUpdate = value; }, /*clone方法 ///clone方法克隆一個紋理物件. */ ///<summary>clone</summary> ///<param name ="texture" type="Texture">接受結果的紋理物件</param> ///<returns type="Texture">返回紋理物件</returns> clone: function ( texture ) { if ( texture === undefined ) texture = new THREE.Texture(); texture.image = this.image; texture.mipmaps = this.mipmaps.slice( 0 ); texture.mapping = this.mapping; texture.wrapS = this.wrapS; texture.wrapT = this.wrapT; texture.magFilter = this.magFilter; texture.minFilter = this.minFilter; texture.anisotropy = this.anisotropy; texture.format = this.format; texture.type = this.type; texture.offset.copy( this.offset ); texture.repeat.copy( this.repeat ); texture.generateMipmaps = this.generateMipmaps; texture.premultiplyAlpha = this.premultiplyAlpha; texture.flipY = this.flipY; texture.unpackAlignment = this.unpackAlignment; return texture; //返回紋理物件 }, /*update方法 ///update方法更新紋理物件 */ ///<summary>update</summary> update: function () { this.dispatchEvent( { type: 'update' } ); }, /*dispose方法 ///dispose方法從記憶體中刪除物件,釋放資源. ///NOTE: 當刪除紋理物件,不要忘記呼叫這個方法,否則會導致記憶體洩露. */ ///<summary>dispose</summary> dispose: function () { this.dispatchEvent( { type: 'dispose' } ); } }; ///EventDispatcher方法應用到當前Texture物件. THREE.EventDispatcher.prototype.apply( THREE.Texture.prototype ); ///設定全域性的Texture物件計數器. THREE.TextureIdCount = 0;
以下程式碼是THREE.JS 原始碼檔案中Texture/Texture.js檔案的註釋.