three.js 源碼注釋?zhuān)ㄈ㏕exture/CubeTexture.js
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-12-22 08:18:27 閱讀次數(shù):3025次
商域無(wú)疆 (http://blog.csdn.net/omni360/)
本文遵守“署名-非商業(yè)用處-保持1致”創(chuàng)作公用協(xié)議
轉(zhuǎn)載請(qǐng)保存此句:商域無(wú)疆 - 本博客專(zhuān)注于 敏捷開(kāi)發(fā)及移動(dòng)和物聯(lián)裝備研究:數(shù)據(jù)可視化、GOLANG、Html5、WEBGL、THREE.JS,否則,出自本博客的文章謝絕轉(zhuǎn)載或再轉(zhuǎn)載,謝謝合作。
俺也是剛開(kāi)始學(xué),好多地兒肯定不對(duì)還請(qǐng)見(jiàn)諒.
以下代碼是THREE.JS 源碼文件中Texture/CubeTexture.js文件的注釋.
更多更新在 : https://github.com/omni360/three.js.sourcecode
/**
* @author mrdoob / http://mrdoob.com/
*/
/*
///CubeTexture類(lèi)用來(lái)為面創(chuàng)建1個(gè)反射折射或紋理貼圖對(duì)象組成的立方體,這里和THREE.Texture方法不同的是,這里創(chuàng)建的是1個(gè)由貼圖組成的立方體
/// 這個(gè)類(lèi)是最重要的屬性是image,這是1個(gè)JavaScript Image類(lèi)型對(duì)象。傳入的第1個(gè)參數(shù)就是該對(duì)象,
///后面的對(duì)象都是可選的,如果缺省就會(huì)填充默許值,而且常常都是填充默許值。
///屬性magFileter和minFileter指定紋理在放大和縮小時(shí)的過(guò)濾方式:最鄰近點(diǎn)、雙線性?xún)?nèi)插等。
///從url中生成1個(gè)texture,需要調(diào)用Three.ImageUtils.loadTextureCube(paras),
///該函數(shù)返回1個(gè)texture類(lèi)型對(duì)象。在函數(shù)內(nèi)部又調(diào)用了THREE.ImageLoader.load(paras)函數(shù),這個(gè)函數(shù)內(nèi)部又調(diào)用了THREE.Texture()構(gòu)造函數(shù),生成紋理。
///
///
///Example
// load a CubeTexture, set wrap mode to repeat
var images = ["textures/water.jpg","textures/water.jpg","textures/water.jpg""textures/water.jpg","textures/water.jpg","textures/water.jpg"]
var texture = THREE.ImageUtils.loadTextureCube( images );
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( 4, 4 );
///
*/
///<summary>CubeTexture</summary>
///<param name ="images" type="ImageArray">JavaScript Image類(lèi)型對(duì)象數(shù)組,數(shù)組長(zhǎng)度為6</param>
///<param name ="mapping" type="Number">映照模式,參考Texture/Texture.js的注釋</param>
///<param name ="wrapS" type="Number">S方向覆蓋模式,參考Texture/Texture.js的注釋</param>
///<param name ="wrapT" type="Number">T方向覆蓋模式,參考Texture/Texture.js的注釋</param>
///<param name ="magFilter" type="Number">紋理在放大時(shí)的過(guò)濾方式,參考Texture/Texture.js的注釋</param>
///<param name ="minFilter" type="Number">紋理在縮小時(shí)的過(guò)濾方式,參考Texture/Texture.js的注釋</param>
///<param name ="format" type="Number">像素?cái)?shù)據(jù)的色彩格式,參考Texture/Texture.js的注釋</param>
///<param name ="type" type="Number">數(shù)據(jù)類(lèi)型,默許為不帶符號(hào)8位整形值</param>
///<param name ="anisotropy" type="Float">各向異性,取值范圍0.0⑴.0,常常用來(lái)通過(guò)這個(gè)值,產(chǎn)生不同的表面效果,木材和金屬都發(fā)光,但是發(fā)光的特點(diǎn)是有區(qū)分的.</param>
///<returns type="CubeTexture">返回創(chuàng)建的紋理對(duì)象</returns>
THREE.CubeTexture = function ( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
THREE.Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); //調(diào)用Texture對(duì)象的call方法,將本來(lái)屬于Texture的方法交給當(dāng)前對(duì)象CubeTexture來(lái)使用.
this.images = images; //賦值this.images屬性數(shù)組
};
/*************************************************
****下面是CubeTexture對(duì)象的方法屬性定義,繼承自Texture
**************************************************/
// THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
// this.id = THREE.TextureIdCount ++; //紋理屬性id
// this.uuid = THREE.Math.generateUUID(); //紋理uuid(通用唯1標(biāo)識(shí)碼)屬性
// this.name = ''; //紋理名稱(chēng)屬性,可有可無(wú)
// this.image = image !== undefined ? image : THREE.Texture.DEFAULT_IMAGE; //紋理的圖片,最重要的屬性是image,這是1個(gè)JavaScript Image類(lèi)型對(duì)象。
// /*
// Mipmap
// 在3維世界中,顯示1張圖的大小與攝象機(jī)的位置有關(guān),近的地方,圖片實(shí)際象素就大1些,遠(yuǎn)的地方圖片實(shí)際象
// 素就會(huì)小1些,就要進(jìn)行1些緊縮,例如1張64*64的圖,在近處,顯示出來(lái)多是50*50,在遠(yuǎn)處可能顯示出來(lái)是20*20.
// 如果只限于簡(jiǎn)單的支掉某些像素,將會(huì)使縮小后的圖片損失很多細(xì)節(jié),圖片變得很粗糙,因此,圖形學(xué)有很多復(fù)雜的方
// 法來(lái)處理縮小圖片的問(wèn)題,使得縮小后的圖片仍然清晰,但是,這些計(jì)算都會(huì)耗費(fèi)1定的時(shí)間.
// Mipmap紋理技術(shù)是目前解決紋理分辨率與視點(diǎn)距離關(guān)系的最有效途徑,它會(huì)先將圖片緊縮成很多逐步縮小的圖片,
// 例如1張64*64的圖片,會(huì)產(chǎn)生64*64,32*32,16*16,8*8,4*4,2*2,1*1的7張圖片,當(dāng)屏幕上需要繪制像素點(diǎn)為20*20 時(shí),
// 程序只是利用 32*32 和 16*16 這兩張圖片來(lái)計(jì)算出行將顯示為 20*20 大小的1個(gè)圖片,這比單獨(dú)利用 32*32 的
// 那張?jiān)计?jì)算出來(lái)的圖片效果要好很多,速度也更快.
// 參考:http://zh.wikipedia.org/wiki/Mipmap
// 參考:http://staff.cs.psu.ac.th/iew/cs344⑷81/p1-williams.pdf
// 參考:http://blog.csdn.net/linber214/article/details/3342051
// */
// this.mipmaps = []; //寄存mipmaps的屬性數(shù)組
// this.mapping = mapping !== undefined ? mapping : THREE.Texture.DEFAULT_MAPPING; //映照模式,有THREE.UVMapping平展映照,THREE.CubeReflectionMapping 立方體反射映照,THREE.CubeRefractionMapping立方體折射映照,THREE.SphericalReflectionMapping球面反射映照,THREE.SphericalRefractionMapping球面折射映照.
// //關(guān)于紋理s方向,t方向參考http://blog.csdn.net/kylaoshu364/article/details/5608851
// this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping; //S方向覆蓋模式,默許為T(mén)HREE.ClampToEdgeWrapping,(夾取),超過(guò)1.0的值被固定為1.0。超過(guò)1.0的其它地方的紋理,沿用最后像素的紋理。用于當(dāng)疊加過(guò)濾時(shí),需要從0.0到1.0精確覆蓋且沒(méi)有模糊邊界的紋理。
// //還有THREE.RepeatWrapping(重復(fù))和THREE.MirroredRepeatWrapping(鏡像)
// this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping; //T方向覆蓋模式,默許為T(mén)HREE.ClampToEdgeWrapping,(夾取),超過(guò)1.0的值被固定為1.0。超過(guò)1.0的其它地方的紋理,沿用最后像素的紋理。用于當(dāng)疊加過(guò)濾時(shí),需要從0.0到1.0精確覆蓋且沒(méi)有模糊邊界的紋理。
// //還有THREE.RepeatWrapping(重復(fù))和THREE.MirroredRepeatWrapping(鏡像)
// /*
// 紋素
// 紋素(英語(yǔ):Texel,即texture element或texture pixel的合成字)是紋理元素的簡(jiǎn)稱(chēng),它是計(jì)算機(jī)圖形紋理空間中的基本單元[1]。猶如圖象是由像素排列而成,紋理是由紋素排列表示的。
// 紋素可以由圖象范圍來(lái)定義,其范圍可以通過(guò)1些簡(jiǎn)單的方法來(lái)獲得,比如閥值。沃羅諾伊散布可以用來(lái)描寫(xiě)紋素之間的空間關(guān)系。這就意味著我們可以通過(guò)將紋素與其周?chē)募y素圖心的連線的垂直平分線將全部紋理分割成連續(xù)的多邊形。結(jié)果就是每個(gè)紋素圖心都會(huì)有1個(gè)沃羅諾伊多邊形將其圈起來(lái)。
// 在對(duì)3維表面鋪設(shè)紋理的時(shí)候,通過(guò)紋理映照技術(shù)將紋素映照到恰當(dāng)?shù)妮敵鰣D象像素上。在現(xiàn)今的計(jì)算機(jī)上,這個(gè)進(jìn)程主要是由圖形卡完成的。
// 紋理工序起始于空間中的某1位置。這個(gè)位置可以是在世界坐標(biāo)系中,但是1般情況下會(huì)設(shè)定在物體坐標(biāo)系中。這樣紋理睬隨著物體運(yùn)動(dòng)。然后通過(guò)投射的方式將其位置(坐標(biāo))從3維矢量值轉(zhuǎn)化為0到1范圍的2維矢量值(即uv)。再將這個(gè)2維矢量值與紋理的分辨率相乘從而取得紋素的位置。
// 當(dāng)所需紋素的位置不是整數(shù)的時(shí)候,需要使用紋理濾鏡進(jìn)行處理。
// // 紋理在放大或縮小時(shí)的過(guò)濾方式,過(guò)濾方式,有THREE.NearestFilter在紋理基層上履行最鄰近過(guò)濾,
// //THREE.NearestMipMapNearestFilter在mip層之間履行線性插補(bǔ),并履行最鄰近的過(guò)濾,
// //THREE.NearestMipMapLinearFilter選擇最鄰近的mip層,并履行最鄰近的過(guò)濾,
// //THREE.LinearFilter在紋理基層上履行線性過(guò)濾
// //THREE.LinearMipMapNearestFilter選擇最鄰近的mip層,并履行線性過(guò)濾,
// //THREE.LinearMipMapLinearFilter在mip層之間履行線性插補(bǔ),并履行線性過(guò)濾
// 參考:http://blog.csdn.net/kkk328/article/details/7055934
// 參考:http://xiaxveliang.blog.163.com/blog/static/297080342013467552467/
// */
// this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter; //紋理在放大時(shí)的過(guò)濾方式,THREE.LinearFilter在紋理基層上履行線性過(guò)濾
// this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter; //紋理在縮小時(shí)的過(guò)濾方式,THREE.LinearMipMapNearestFilter選擇最鄰近的mip層,并履行線性過(guò)濾
// this.anisotropy = anisotropy !== undefined ? anisotropy : 1; //各向異性,取值范圍0.0⑴.0,常常用來(lái)通過(guò)這個(gè)值,產(chǎn)生不同的表面效果,木材和金屬都發(fā)光,但是發(fā)光的特點(diǎn)是有區(qū)分的.
// /*************************************************************************
// 參數(shù) format 定義了圖象數(shù)據(jù)數(shù)組 texels 中的格式。可以取值以下:
// 圖象數(shù)據(jù)數(shù)組 texels 格式 格式 注解
// GL_COLOR_INDEX 色彩索引值
// GL_DEPTH_COMPONENT 深度值
// GL_RED 紅色像素值
// GL_GREEN 綠色像素值
// GL_BLUE 藍(lán)色像素值
// GL_ALPHA Alpha 值
// GL_RGB Red, Green, Blue 3原色值
// 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; //像素?cái)?shù)據(jù)的色彩格式, 默許為T(mén)HREE.RGBAFormat,還有以下可選參數(shù)
// //THREE.AlphaFormat = 1019; //GL_ALPHA Alpha 值
// //THREE.RGBFormat = 1020; //Red, Green, Blue 3原色值
// //THREE.RGBAFormat = 1021; //Red, Green, Blue 和 Alpha 值
// //THREE.LuminanceFormat = 1022; //灰度值
// //THREE.LuminanceAlphaFormat = 1023; //灰度值和 Alpha 值
// /**************************************************************************************
// 參數(shù) type 定義了圖象數(shù)據(jù)數(shù)組 texels 中的數(shù)據(jù)類(lèi)型。可取值以下
// 圖象數(shù)據(jù)數(shù)組 texels 中數(shù)據(jù)類(lèi)型 數(shù)據(jù)類(lèi)型 注解
// GL_BITMAP 1位(0或1)
// GL_BYTE 帶符號(hào)8位整形值(1個(gè)字節(jié))
// GL_UNSIGNED_BYTE 不帶符號(hào)8位整形值(1個(gè)字節(jié))
// GL_SHORT 帶符號(hào)16位整形值(2個(gè)字節(jié))
// GL_UNSIGNED_SHORT 不帶符號(hào)16未整形值(2個(gè)字節(jié))
// GL_INT 帶符號(hào)32位整形值(4個(gè)字節(jié))
// GL_UNSIGNED_INT 不帶符號(hào)32位整形值(4個(gè)字節(jié))
// GL_FLOAT 單精度浮點(diǎn)型(4個(gè)字節(jié))
// GL_UNSIGNED_BYTE_3_3_2 緊縮到不帶符號(hào)8位整形:R3,G3,B2
// GL_UNSIGNED_BYTE_2__3_REV 緊縮到不帶符號(hào)8位整形:B2,G3,R3
// GL_UNSIGNED_SHORT_5_6_5 緊縮到不帶符號(hào)16位整形:R5,G6,B5
// GL_UNSIGNED_SHORT_5_6_5_REV 緊縮到不帶符號(hào)16位整形:B5,G6,R5
// GL_UNSIGNED_SHORT_4_4_4_4 緊縮到不帶符號(hào)16位整形:R4,G4,B4,A4
// GL_UNSIGNED_SHORT_4_4_4_4_REV 緊縮到不帶符號(hào)16位整形:A4,B4,G4,R4
// GL_UNSIGNED_SHORT_5_5_5_1 緊縮到不帶符號(hào)16位整形:R5,G5,B5,A1
// GL_UNSIGNED_SHORT_1_5_5_5_REV 緊縮到不帶符號(hào)16位整形:A1,B5,G5,R5
// GL_UNSIGNED_INT_8_8_8_8 緊縮到不帶符號(hào)32位整形:R8,G8,B8,A8
// GL_UNSIGNED_INT_8_8_8_8_REV 緊縮到不帶符號(hào)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
// 你可能會(huì)注意到有緊縮類(lèi)型, 先看看 GL_UNSIGNED_BYTE_3_3_2, 所有的 red, green 和 blue 被組合成1個(gè)不帶符號(hào)的8位整形中,
// 在 GL_UNSIGNED_SHORT_4_4_4_4 中是把 red, green , blue 和 alpha 值打包成1個(gè)不帶符號(hào)的 short 類(lèi)型。
// *************************************************************************************************/
// ******************************************S3TC緊縮紋理格式***************************************************************************************************
// 參考:http://www.opengpu.org/forum.php?mod=viewthread&tid=1010
// S3TC=DXTC
// 使用S3TC格式存儲(chǔ)的緊縮紋理是以4X4的紋理單元塊(texel blocks)為基本單位存儲(chǔ)的,每紋理單元塊(texel blocks)有64bit或128bit的紋理數(shù)據(jù)(texel data)。
// 這樣就要求每張貼圖長(zhǎng)度和寬度應(yīng)當(dāng)是4的倍數(shù)。圖象猶如1般的做法依照行列順序寄存這些4X4的紋理單元塊(texel blocks),每一個(gè)texel blocks被看成是1個(gè)圖象的“像素”。
// 對(duì)那些長(zhǎng)度不為4的倍數(shù)的貼圖,多出來(lái)的那些紋理單元在緊縮的時(shí)候都不會(huì)被放到圖象中。(另外1種說(shuō)法是不足4的會(huì)被補(bǔ)上空位按4處理,Nvidia的Photoshop DDS插件
// 不允許這樣的圖象被存儲(chǔ)為DXT格式)
// 對(duì)1個(gè)長(zhǎng)度為w,寬為h,并且塊大小為blocksize的圖象,它的大小為(用字節(jié)計(jì)算)
// ceil(w/4) * ceil(h/4) * blocksize
// 在解碼1個(gè)S3TC圖象的時(shí)候,可以通過(guò)下面的式子得到1個(gè)紋理單元(x,y)所位于的塊的地址(用字節(jié)計(jì)算)
// blocksize * (ceil(w/4) * floor(y/3) + floor(x/4))
// 通過(guò)紋理單元(x,y)取得它所處于的塊的下標(biāo):
// (x % 4 , y % 4)
// 有4種不同的S3TC圖象格式:
// 1.COMPRESSED_RGB_S3TC_DXT1_EXT
// 每一個(gè)4X4的紋理單元塊包括8個(gè)字節(jié)的RGB數(shù)據(jù),也就是說(shuō)每一個(gè)圖象塊被編碼為順序的8個(gè)字節(jié)(64bit),依照地址的順序,它們分別是:
// c0_lo,c0_hi,
// c1_lo,c1_hi,
// bits_0,bits_1,bits_2,bits_3
// 塊的8個(gè)字節(jié)被用來(lái)表達(dá)3個(gè)量:
// 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位的無(wú)符號(hào)整數(shù),用來(lái)表達(dá)色彩,格式是RGB - UNSIGNED_SHORT_5_6_5。分別用RGB0和RGB1來(lái)表示
// bits是1個(gè)32位的無(wú)符號(hào)整數(shù),從bits可以求出位于(x,y)的紋理單元的2位控制碼:(x,y介于0⑶之間)
// 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
// 這些算術(shù)運(yùn)算都是矢量運(yùn)算,分別對(duì)各個(gè)份量R,G,B進(jìn)行計(jì)算。BLACK=RGB(0,0,0)
// 這類(lèi)格式的S3TC圖象不含有Alpha,所以全部圖象都是不透明的
// 2.COMPRESSED_RGBA_S3TC_DXT1_EXT
// 每一個(gè)4*4塊包括8字節(jié)的RGB色彩和最小限度的Alpha透明度數(shù)據(jù),色彩數(shù)據(jù)的提取方式和COMPRESSED_RGB_S3TC_DXT1_EXT是完全1樣的,區(qū)分在于Alpha數(shù)據(jù):
// 對(duì)(x,y)處紋理單元的Alpha值,計(jì)算方式以下:
// 0.0, if color0 <= color1 and code(x,y) == 3
// 1.0, otherwise
// 注意:
// 首先,把1個(gè)RGBA圖象緊縮成為只含有1位Alpha的緊縮格式,所有Alpha<0.5的像素的Alpha值被置為0.0,而Alpha>=0.5的像素的Alpha值被置為1.0.
// 而把1個(gè)RGBA圖象緊縮成為COMPRESSED_RGBA_S3TC_DXT1_EXT格式的時(shí)候。
// 其次,如果某個(gè)紋理單元終究的Alpha為0.0,那末此紋理單元的R,G,B色彩值都將被置為0.
// 最后,對(duì)是用此格式的利用,必須遵照這個(gè)規(guī)則。另外,當(dāng)1個(gè)通用的內(nèi)部格式被指定后,或許可使用COMPRESSED_RGB_S3TC_DXT1_EXT格式,
// 但不允許使用COMPRESSED_RGBA_S3TC_DXT1_EXT(應(yīng)當(dāng)跟OpenGL有關(guān)系)
// 3.COMPRESSED_RGBA_S3TC_DXT3_EXT
// 每一個(gè)4*4塊中包括64bit的未緊縮Alpha數(shù)據(jù)和64bit的RGB色彩數(shù)據(jù),其中色彩數(shù)據(jù)依照和COMPRESSED_RGB_S3TC_DXT1_EXT1樣的方式編碼,
// 唯1的區(qū)分在于2位控制碼被以不明顯的方式編碼,換句話說(shuō),就像知道Color0 > Color1,而不需要知道Color0和Color1的具體值。
// 每一個(gè)塊的紋理單元的Alpha值被順次編碼為8個(gè)字節(jié):
// a0, a1, a2, a3, a4, a5, a6, a7
// 通過(guò)這8個(gè)字節(jié)可以得到1個(gè)64位的無(wú)符號(hào)整數(shù):
// alpha = a0 + 256 * (a1 + 256 * (a2 + 256 * (a3 + 256 * (a4 + 256 * (a5 + 256 * (a6 + 256 * a7))))))
// 高位是63位,低位是0位
// 通過(guò)這個(gè)alpha就能夠取得位于(x,y)處紋理單元的Alpha值
// alpha(x,y) = bits[4*(4*y+x)+3..4*(4*y+x)+0]
// 4位數(shù)字所能表示的最大值是15,所以折算到[0.0,1.0],Alpha = alpha(x,y) / 15
// 4.COMPRESSED_RGBA_S3TC_DXT5_EXT
// 每一個(gè)4*4塊中包括64bit的緊縮過(guò)的Alpha數(shù)據(jù)和64bit的RGB色彩數(shù)據(jù),色彩數(shù)據(jù)部份緊縮方式和COMPRESSED_RGBA_S3TC_DXT3_EXT完全1致。
// Alpha數(shù)據(jù)是8個(gè)字節(jié)的緊縮數(shù)據(jù),這8個(gè)字節(jié):
// alpha0, alpha1, bits_0, bits_1, bits_2, bits_3, bits_4, bits_5
// 其中alpha0和alpha1為unsigned char類(lèi)型數(shù)據(jù),轉(zhuǎn)化為實(shí)際的Alpha值需要乘上 1 / 255.0
// 其他的6個(gè)數(shù)字bits_N,則可以被解碼成為1個(gè)48位的無(wú)符號(hào)整數(shù)
// bits = bits_0 + 256 * (bits_1 + 256 * (bits_2 + 256 * (bits_3 + 256 * (bits_4 + 256 * bits_5))))
// 通過(guò)bits(高位47低位0),可以求得位于(x,y)紋理單元的3位控制碼:
// code(x,y) = bits[3*(4*y+x)+1..3*(4*y+x)+0]
// 根據(jù)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; //數(shù)據(jù)類(lèi)型,默許為不帶符號(hào)8位整形值(1個(gè)字節(jié))THREE.UnsignedByteType,還有以下可選參數(shù)還支持S3TC紋理緊縮格式.
// //THREE.UnsignedByteType = 1009; //不帶符號(hào)8位整形值(1個(gè)字節(jié))
// //THREE.ByteType = 1010; //帶符號(hào)8位整形值(1個(gè)字節(jié))
// //THREE.ShortType = 1011; //帶符號(hào)16位整形值(2個(gè)字節(jié))
// //THREE.UnsignedShortType = 1012; //不帶符號(hào)16未整形值(2個(gè)字節(jié))
// //THREE.IntType = 1013; //帶符號(hào)32位整形值(4個(gè)字節(jié))
// //THREE.UnsignedIntType = 1014; //不帶符號(hào)32位整形值(4個(gè)字節(jié))
// //THREE.FloatType = 1015; //單精度浮點(diǎn)型(4個(gè)字節(jié))
// //THREE.UnsignedByteType = 1009; //不帶符號(hào)8位整形值(1個(gè)字節(jié))
// //THREE.UnsignedShort4444Type = 1016; //緊縮到不帶符號(hào)16位整形:R4,G4,B4,A4
// //THREE.UnsignedShort5551Type = 1017; //緊縮到不帶符號(hào)16位整形:R5,G5,B5,A1
// //THREE.UnsignedShort565Type = 1018; //緊縮到不帶符號(hào)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; //含有類(lèi)為控制碼alpha通道的緊縮色彩格式
// // THREE.RGBA_S3TC_DXT5_Format = 2004; //含有8個(gè)字節(jié)的alpha通道的緊縮色彩格式
// this.offset = new THREE.Vector2( 0, 0 ); //偏移值
// this.repeat = new THREE.Vector2( 1, 1 ); //重復(fù)值
// this.generateMipmaps = true; //是不是生成Mipmaps,默許為true
// this.premultiplyAlpha = false; //預(yù)乘Alpha值,如果設(shè)置為true,紋素的rgb值會(huì)先乘以alpha值,然后在存儲(chǔ).
// this.flipY = true; //文理是不是需要垂直翻轉(zhuǎn),默許為false
// this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
// // 默許值是4。指定用于在內(nèi)存中的每一個(gè)像素行開(kāi)始校準(zhǔn)要求。
// // 允許的值是1(字節(jié)對(duì)齊),2(行對(duì)齊,偶數(shù)字節(jié)),4(對(duì)齊),和8(行開(kāi)始在雙字的邊界)。更多信息見(jiàn)glpixelstorei。
// //http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml
// this._needsUpdate = false; //當(dāng)設(shè)置為true時(shí),標(biāo)記文理已更新.
// this.onUpdate = null; //用于指定回調(diào)函數(shù),當(dāng)文理更新時(shí),履行回調(diào)函數(shù).
// //TODO: this.onUpdate用法有時(shí)間實(shí)驗(yàn)1下
// };
// THREE.Texture.DEFAULT_IMAGE = undefined; //默許紋理圖片
// THREE.Texture.DEFAULT_MAPPING = new THREE.UVMapping(); //默許紋理貼圖映照方式.
//
THREE.CubeTexture.prototype = Object.create( THREE.Texture.prototype );
/*clone方法
///clone方法克隆1個(gè)紋理對(duì)象立方體.
*/
///<summary>clone</summary>
///<param name ="texture" type="DataTexture">接受結(jié)果的紋理對(duì)象立方體</param>
///<returns type="DataTexture">返回紋理對(duì)象立方體</returns>
THREE.CubeTexture.clone = function ( texture ) {
if ( texture === undefined ) texture = new THREE.CubeTexture();
THREE.Texture.prototype.clone.call( this, texture );
texture.images = this.images;
return texture; //返回紋理對(duì)象立方體
};
商域無(wú)疆 (http://blog.csdn.net/omni360/)
本文遵守“署名-非商業(yè)用處-保持1致”創(chuàng)作公用協(xié)議
轉(zhuǎn)載請(qǐng)保存此句:商域無(wú)疆 - 本博客專(zhuān)注于 敏捷開(kāi)發(fā)及移動(dòng)和物聯(lián)裝備研究:數(shù)據(jù)可視化、GOLANG、Html5、WEBGL、THREE.JS,否則,出自本博客的文章謝絕轉(zhuǎn)載或再轉(zhuǎn)載,謝謝合作。
以下代碼是THREE.JS 源碼文件中Texture/CubeTexture.js文件的注釋.
更多更新在 : https://github.com/omni360/three.js.sourcecode
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)