1. 紋理映射
??紋理映射,簡單的理解就是把一副圖像映射到圖形上的過程甘磨。比如一個圖片像壁紙一樣貼在物體的表面泞坦。這個技術(shù)可以從過年一個特殊類型標(biāo)中的著色器中查詢值,例如 顏色值∈快現(xiàn)在所有OpenGL著色階段都有紋理映射,常用的階段為處理片元的環(huán)境中蔗崎。
2. 紋理
??說完紋理映射,那什么是紋理呢扰藕?紋理圖(簡稱紋理)缓苛,通常是攝像機捕獲的,也可以是程序中生成的邓深,也可以是OpenGL以紋理代替顯示設(shè)備為目標(biāo)渲染的未桥。紋理是2維的,但是OpenGL也支持許多其他類型的紋理芥备,比如 1維冬耿、3維、立方體映射萌壳、緩沖紋理亦镶、數(shù)組紋理等日月。
??紋理由紋素組成,通常包括顏色值缤骨。也有很多實用程序把紋理看作是可以在著色器中查詢的表爱咬,用于所需要的任意目的。使用步驟如下:
? 創(chuàng)建一個紋理對象绊起,為它加載紋素數(shù)據(jù)
? 為頂點增加紋理坐標(biāo)
? 把紋理圖與著色器中將要使用的紋理采樣器關(guān)聯(lián)
? 在著色器中使用紋理采樣器來查詢紋素值
3. 紋理基本類型
??OpenGL支持許多類型的維數(shù)和布局可變的紋理對象精拟,每個紋理對象表示組成完整紋理的一組圖像。每個圖像可以是紋素的1維虱歪、2維或者3維數(shù)組蜂绎,并且很多圖像可以放在另一個圖像的頂部來形成mipmap金字塔。但并不是所有的紋理都可以表示紋理數(shù)組或者形成mipmap金字塔笋鄙,比如矩形紋理對象师枣、紋理緩沖。
??另外紋理可以包括1維或者2維切片的數(shù)組局装,這樣的紋理成為數(shù)組紋理坛吁,數(shù)組的每一個元素都是一個切片,立方體映射就是紋理數(shù)組的一個示例铐尚,它共有6個面(切片)拨脉,立方體映射數(shù)組表示立方體映射紋理的數(shù)組,是6個面的整數(shù)倍宣增。
??紋理也可以用于2維和2維數(shù)組紋理的多重采樣紋理類型表示多種采樣表面玫膀。多重采樣是一個用于抗鋸齒的術(shù)語,其中每個像素被賦予多個獨立的顏色爹脾,然后在渲染過程中合并這些顏色來生成最終的輸出顏色帖旨。多重采樣紋理對于每個紋素都有幾個采樣(典型值在2和8之間)。
4. 紋理綁定
??紋理通過紋理單元綁定到OpenGL環(huán)境灵妨,其中紋理單元用命名為GL_TEXTURE0到GL_TEXTUREi的綁定點表示解阅,這里i是實現(xiàn)支持的紋理單元的數(shù)組減一。許多紋理可以綁定到同樣的環(huán)境泌霍,因為同一個環(huán)境可以支持多個不同的紋理單元货抄。
// Uniform index.
enum
{
UNIFORM_Y,
UNIFORM_UV,
UNIFORM_ROTATION_ANGLE,
UNIFORM_RANGEOFFSET,
UNIFORM_COLOR_CONVERSION_MATRIX,
NUM_UNIFORMS
};
// 0 and 1 are the texture IDs of _lumaTexture and _chromaTexture respectively.
glUniform1i(uniforms[UNIFORM_Y], 0);
glUniform1i(uniforms[UNIFORM_UV], 1);
glUniform1f(uniforms[UNIFORM_ROTATION_ANGLE], 0);
glUniform1f(uniforms[UNIFORM_RANGEOFFSET], 0);
glUniformMatrix3fv(uniforms[UNIFORM_COLOR_CONVERSION_MATRIX], 1, GL_FALSE, _preferredConversion);
CVOpenGLESTextureRef _lumaTexture;
CVOpenGLESTextureCacheRef _videoTextureCache;
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, _context, NULL, &_videoTextureCache);
//選擇當(dāng)前被紋理函數(shù)改變的紋理單元
glActiveTexture(GL_TEXTURE0);
//
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
_videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RED_EXT,//GL_LUM
frameWidth,
frameHeight,
GL_RED_EXT,//GL_RED_EXT
GL_UNSIGNED_BYTE,
0,
&_lumaTexture);
//綁定紋理
glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
....
....
glActiveTexture(GL_TEXTURE1);
....
....
??紋理一旦被綁定到環(huán)境中,著色器就可以使用采樣器變量來訪問朱转,而采樣器變量用匹配紋理的位數(shù)來聲明蟹地。紋理位數(shù)(紋理目標(biāo))和對應(yīng)采樣器類型(必須在著色器中使用來訪問紋理中的紋素)對應(yīng)如下:
目標(biāo)GL_TEXTUREi | 采樣器類型 | 維度 |
---|---|---|
1D | sampler1D | 1D |
1D_ARRAY | sampler1DArrary | 1D數(shù)組 |
2D | sampler2D | 2D |
2D_ARRAY | sampler2DArrary | 2D數(shù)組 |
2D_MULTISAMPLE | sampler2DMS | 2D多重采樣 |
2D_MULTISAMPLE_ARRAY | sampler2DMSArrary | 2D多重采樣數(shù)組 |
3D | sampler3D | 3D |
CUBE | samplerCube | 立方體映射紋理 |
ARRAY | samplerCubeArray | 立方體映射數(shù)組 |
RECTANGLE | samplerRect | 2D矩形 矩形紋理對象(GL_TEXTURE_RECTANGLE)是2維紋理的特例,表示一個簡單的紋素矩形藤为,它沒有mipmap并且不能表示紋理數(shù)組怪与。 |
BUUFER | samplerBuffer | 1D緩存 緩沖紋理(GL_TEXTURE_BUFFER)表示任意紋素的1維數(shù)組,它沒有mipmap缅疟,不能聚合數(shù)組分别。 它的存儲是用一個緩沖對象來表示的遍愿。故緩沖紋理的上邊界比普通的1維紋理大的多。 緩沖紋理使任意著色器階段的數(shù)據(jù)訪問(例如頂點數(shù)據(jù))而不用把它拷貝進紋理圖像成為可能茎杂。 |