OpenGL紋理 基本概念

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ù))而不用把它拷貝進紋理圖像成為可能茎杂。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末错览,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子煌往,更是在濱河造成了極大的恐慌倾哺,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽脖,死亡現(xiàn)場離奇詭異羞海,居然都是意外死亡,警方通過查閱死者的電腦和手機曲管,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門却邓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人院水,你說我怎么就攤上這事腊徙。” “怎么了檬某?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵撬腾,是天一觀的道長。 經(jīng)常有香客問我恢恼,道長民傻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任场斑,我火速辦了婚禮漓踢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漏隐。我一直安慰自己喧半,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布青责。 她就那樣靜靜地躺著薯酝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爽柒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天者填,我揣著相機與錄音浩村,去河邊找鬼。 笑死占哟,一個胖子當(dāng)著我的面吹牛心墅,可吹牛的內(nèi)容都是我干的酿矢。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼怎燥,長吁一口氣:“原來是場噩夢啊……” “哼瘫筐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铐姚,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤策肝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隐绵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體之众,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年依许,在試婚紗的時候發(fā)現(xiàn)自己被綠了棺禾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡峭跳,死狀恐怖膘婶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛀醉,我是刑警寧澤悬襟,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站滞欠,受9級特大地震影響古胆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筛璧,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一逸绎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夭谤,春花似錦棺牧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至醉锄,卻和暖如春乏悄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恳不。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工檩小, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烟勋。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓规求,卻偏偏與公主長得像筐付,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阻肿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容