OpenGL-基礎(chǔ)紋理

一颂翼、原始圖像數(shù)據(jù)

1.像素包裝

圖像存儲(chǔ)空間 = 圖像的高度 * 圖像寬度 * 每個(gè)像素的字節(jié)數(shù)

二晃洒、函數(shù)

(注意方法名是不一樣的慨灭,i 和f)

// 改變像素存儲(chǔ)方式
void glPixelStorei(GLenum pname,GLint param);

// 恢復(fù)像素存儲(chǔ)方式
void glPixelStoref(GLenum pname,GLfloat param);

  • 舉例:

// 參數(shù)1: GL_UNPACK_ALIGNMENT 指定OpenGL 如何從數(shù)據(jù)緩存區(qū)中解包圖像 數(shù)據(jù)

// 參數(shù)2: 表示參數(shù)GL_UNPACK_ALIGNMENT 設(shè)置的值

// GL_UNPACK_ALIGNMENT 指內(nèi)存中每個(gè)像素行起點(diǎn)的排列請(qǐng)求,允許設(shè)置為1 (byte排列)球及、2(排列為偶數(shù)byte的行)氧骤、4(字word排列)、8(行從雙字節(jié) 邊界開始)

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

2.認(rèn)識(shí)函數(shù) 從顏色緩存區(qū)內(nèi)容作為像素圖直接讀取

// 把像素?cái)?shù)據(jù)從內(nèi)存中寫入到幀緩存區(qū)(參數(shù)和下面函數(shù)參數(shù)一樣)

void glDrawPixels (GLsizei width, GLsizei , 
                    GLenum format, GLenum type, 
                    const GLvoid *pixels);

// 參數(shù)1: x,矩形左下角的窗口坐標(biāo)
// 參數(shù)2: y,矩形左下?的窗口坐標(biāo)
// 參數(shù)3: width,矩形的寬吃引,以像素為單位
// 參數(shù)4: height,矩形的高筹陵,以像素為單位
// 參數(shù)5: format,OpenGL 的像素格式,參考 表6-1
// 參數(shù)6: type,解釋參數(shù)pixels指向的數(shù)據(jù)镊尺,告訴OpenGL 使用緩存區(qū)中的什么 數(shù)據(jù)類型來存儲(chǔ)顏色分量朦佩,像素?cái)?shù)據(jù)的數(shù)據(jù)類型
// 參數(shù)7: pixels,指向圖形數(shù)據(jù)的指針

void glReadPixels(GLint x,GLint y,GLSizei width,GLSizei
        height, GLenum format, GLenum type,const void * pixels);

// 指定讀取的緩存
glReadBuffer(mode);

// 指定寫入的緩存
glWriteBuffer(mode);

表6-1 OpenGL 像素格式

3.認(rèn)識(shí)函數(shù) 載入紋理

       void glTexImage1D(GLenum target,GLint level,GLint
       internalformat,GLsizei width,GLint border,GLenum
       format,GLenum type,void *data);

       void glTexImage2D(GLenum target,GLint level,GLint
       internalformat,GLsizei width,GLsizei height,GLint
       border,GLenum format,GLenum type,void * data);

        
       void glTexImage3D(GLenum target,GLint level,GLint 
       internalformat,GLSizei width,GLsizei height,GLsizei depth,
       GLint border,GLenum format,GLenum type,void *data);

// 參數(shù)介紹

  • target: GL_TEXTURE_1DGL_TEXTURE_2D庐氮、GL_TEXTURE_3D语稠。
  • Level: 指定所加載的mip貼圖層次。一般我們都把這個(gè)參數(shù)設(shè)置為0弄砍。
  • internalformat: 每個(gè)紋理單元中存儲(chǔ)多少顏色成分仙畦。
  • width、height音婶、depth參數(shù): 指加載紋理的寬度议泵、高度、深度桃熄。(這些值以前必須是2的整數(shù)次方先口。這是因?yàn)?OpenGL 舊版本遺留下的一個(gè)要求。當(dāng)然現(xiàn)在已經(jīng)可以支持不是 2 的整數(shù)次方瞳收。但是開發(fā)者們還是習(xí)慣使用以 2 的整數(shù)次方去設(shè)置這些參數(shù)碉京。)
  • border參數(shù): 允許為紋理貼圖指定一個(gè)邊界寬度。
  • format螟深、type谐宙、data參數(shù): 與 glDrawPixels 函數(shù)對(duì)應(yīng)的參數(shù)相同

4.更新紋理

  void glTexSubImage1D(GLenum target, GLint level,
                                GLint xOffset, GLsizei width,
                                GLenum format, GLenum type,
                                const GLvoid *data);


  void glTexSubImage2D(GLenum target, GLint level,
                           GLint xOffset, GLint yOffset,
                           GLsizei width, GLsizei height,
                           GLenum format, GLenum type,
                           const GLvoid *data);


  void glTexSubImage3D(GLenum target, GLint level,
                          GLint xOffset, GLint yOffset,
                          GLint zOffset, GLsizei width,
                          GLsizei height, GLsizei depth,
                          Glenum type, const GLvoid * data);

5.插入替換紋理

void glCopyTexSubImage1D(GLenum target, GLint level,
                               GLint xoffset, GLint x,
                               GLint y, GLsizei width);

 void glCopyTexSubImage2D(GLenum target, GLint level,
                              GLint xoffset, GLint yOffset,
                              GLint x, GL y, GLsizei width,
                              GLsizei height);

 void glCopyTexSubImage3D(GLenum target, GLint level,
                             GLint xoffset,GLint yOffset,
                             GLint zOffset,GLint x,GLint y,
                             GLsizei width,GLsizei height);

6.使?顏色緩存區(qū)加載數(shù)據(jù),形成新的紋理使?

void glCopyTexImage1D(GLenum target,GLint level,GLenum
  internalformt,GLint x,GLint y,GLsizei width,GLint border);

void glCopyTexImage2D(GLenum target,GLint level,GLenum
  internalformt,GLint x,GLint y,GLsizei width,GLsizei
  height,GLint border);

// x,y 在顏色緩存區(qū)中指定了開始讀取紋理數(shù)據(jù)的位置
// 緩存區(qū)里的數(shù)據(jù),是源緩存區(qū)通過glReadBuffer設(shè)置的
// 注意: 不存在 glCopyTextImage3D 界弧,因?yàn)槲覀儫o法從 2D 顏色緩存區(qū)中獲取體積 數(shù)據(jù)

7.紋理理對(duì)象

// 使用函數(shù)分配紋理對(duì)象
// 指定紋理對(duì)象的數(shù)量 和 指針(指針指向?個(gè)無符號(hào)整形數(shù)組凡蜻,由紋理對(duì)象標(biāo)識(shí)符填充)。

void glGenTextures(GLsizei n,GLuint * textTures);

// 綁定紋理狀態(tài)
// 參數(shù)target: GL_TEXTURE_1D垢箕、GL_TEXTURE_2D划栓、GL_TEXTURE_3D
// 參數(shù)texture: 需要綁定的紋理對(duì)象

void glBindTexture(GLenum target,GLunit texture);

// 刪除綁定紋理對(duì)象
// 紋理對(duì)象 以及 紋理對(duì)象指針(指針指向一個(gè)無符號(hào)整形數(shù)組,由紋理對(duì)象標(biāo)識(shí)符填充)条获。

void glDeleteTextures(GLsizei n,GLuint *textures);

// 測試紋理對(duì)象是否有效
// 如果texture是一個(gè)已經(jīng)分配空間的紋理對(duì)象忠荞,那么這個(gè)函數(shù)會(huì)返回GL_TRUE, 否則會(huì)返回GL_FALSE。

GLboolean glIsTexture(GLuint texture);

8.設(shè)置紋理參數(shù)

  • 參數(shù)1: target, 指定這些參數(shù)將要應(yīng)?在那個(gè)紋理模式上,?如GL_TEXTURE_1D委煤、GL_TEXTURE_2D堂油、GL_TEXTURE_3D。

  • 參數(shù)2: pname, 指定需要設(shè)置那個(gè)紋理參數(shù)

  • 參數(shù)3: param, 設(shè)定特定的紋理參數(shù)的值

glTexParameterf(GLenum target,GLenum pname,GLFloat param);

glTexParameteri(GLenum target,GLenum pname,GLint param);

glTexParameterfv(GLenum target,GLenum pname,GLFloat *param);

glTexParameteriv(GLenum target,GLenum pname,GLint *param);
(2) 過濾方式比較 和 紋理過濾比較
2種紋理過濾方式?較

// 紋理縮小時(shí),使?鄰近過濾
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)

// 紋理放大時(shí),使?線性過濾
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_HEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_HEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

9.設(shè)置環(huán)繞方式

  • 參數(shù)1: GL_TEXTURE_1D碧绞、GL_TEXTURE_2D府框、GL_TEXTURE_3D

  • 參數(shù)2: GL_TEXTURE_WRAP_S、GL_TEXTURE_T讥邻、GL_TEXTURE_R,針對(duì)s,t,r坐標(biāo)

  • 參數(shù)3: GL_REPEAT迫靖、GL_CLAMP、GL_CLAMP_TO_EDGE计维、GL_CLAMP_TO_BORDER
    (1)GL_REPEAT: OpenGL 在紋理坐標(biāo)超過1.0的方向上對(duì)紋理進(jìn)?重復(fù);
    (2)GL_CLAMP: 所需的紋理單元取?紋理邊界或TEXTURE_BORDER_COLOR.
    (3)GL_CLAMP_TO_EDGE 環(huán)繞模式強(qiáng)制對(duì)范圍之外的紋理坐標(biāo)沿著合法的紋理單元的最后一行或者最后一列來進(jìn)行采樣。
    (4)GL_CLAMP_TO_BORDER: 在紋理坐標(biāo)在0.0到1.0范圍之外的只使用邊界紋理單元撕予。
    邊界紋理單元是作為圍繞基本圖像的額外的行和列鲫惶,并與基本紋理圖像一起加載的。

glTextParameteri(GL_TEXTURE_2D, 
                GL_TEXTURE_WRAR_S, 
                GL_CLAMP_TO_EDGE);

glTextParameteri(GL_TEXTURE_2D,
               GL_TEXTURE_WRAR_T,
               GL_CLAMP_TO_EDGE);

10.設(shè)置 Mip 貼圖

// 設(shè)置 mip 貼圖基層 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);

// 設(shè)置 mip 貼圖最大層 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);

11.判斷壓縮 與 選擇壓縮方式

GLint comFlag;
// 判斷紋理是否被成功壓縮 glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag);

// 根據(jù)選擇的壓縮紋理格式实抡,選擇最快欠母、最優(yōu)、?行選擇的算法方式選擇壓縮格式吆寨。 glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST); glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST); glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE);

12.加載壓縮紋理

  • target: GL_TEXTURE_1D赏淌、GL_TEXTURE_2DGL_TEXTURE_3D啄清。

  • Level: 指定所加載的mip貼圖層次六水。一般我們都把這個(gè)參數(shù)設(shè)置為0。

  • internalformat: 每個(gè)紋理單元中存儲(chǔ)多少顏色成分辣卒。

  • width掷贾、height、depth參數(shù): 指加載紋理的寬度荣茫、?度想帅、深度。
    (注意! 這些值以前必須是2的整數(shù)次方啡莉。這是因?yàn)榕f版本上遺留下的?個(gè)要求港准。當(dāng)然現(xiàn)在已經(jīng)可以?持不是2的整數(shù)次方。但是開發(fā)者們還是習(xí)慣使用以2的整數(shù)次方去寫參數(shù)咧欣。)

  • border參數(shù): 允許為紋理貼圖指定一個(gè)邊界寬度浅缸。

  • format、type魄咕、data參數(shù): 與 glDrawPixels 函數(shù)的參數(shù)相同

void glCompressedTexImage1D(GLenum target,
                  GLint level,GLenum internalFormat,
                  GLsizei width,GLint border,
                  GLsizei imageSize,void *data);

void glCompressedTexImage2D(GLenum target,
                  GLint level,GLenum internalFormat,
                  GLsizei width,GLint heigth,GLint border,
                  GLsizei imageSize,void *data);

void glCompressedTexImage3D(GLenum target,
                  GLint level,GLenum internalFormat,
                  GLsizei width,GLsizei heigth,GLsizei depth,
                  GLint border,GLsizei imageSize,void *data);
(2)glGetTexLevelParameter 函數(shù)提取的壓縮紋理格式

// 如果紋理被壓縮疗杉,返回1,否則返回0
GL_TEXTURE_COMPRESSED

// 壓縮后的紋理的?小(以字節(jié)為單位)
GL_TEXTURE_COMPRESSED_IMAGE_SIZE

// 所使用的壓縮格式
GL_TEXTURE_INTERNAL_FORMAT

// 受支持的壓縮紋理格式數(shù)量
GL_NUM_COMPRESSED_TEXTURE_FORMATS

// 一個(gè)包含了?些常量值的數(shù)組,每個(gè)常量值對(duì)應(yīng)于一種受支持的壓縮紋理格式
GL_COMPRESSED_TEXTURE_FORMATS

// 壓縮紋理提示的值(GL/NICEST/GL_FASTEST)
GL_TEXTURE_COMPRESSION_HINT

(3)GL_EXT_texture_compression_s3tc 壓縮格式

// RGB 數(shù)據(jù)被壓縮烟具,alpha值始終是1.0
GL_COMPRESSED_RGB_S3TC_DXT1

// RGBA 數(shù)據(jù)被壓縮梢什,alpha值返回 1.0 或者 0.0
GL_COMPRESSED_RGBA_S3TC_DXT1

// RGB 值被壓縮,alpha 值用4位存儲(chǔ)
GL_COMPRESSED_RGAB_S3TC_DXT3

// RGB 數(shù)據(jù)被壓縮朝聋,alpha 值是一些8位值的加權(quán)平均值
GL_COMPRESSED_RGBA_SETC_DXT5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗡午,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冀痕,更是在濱河造成了極大的恐慌荔睹,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件言蛇,死亡現(xiàn)場離奇詭異僻他,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腊尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門吨拗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婿斥,你說我怎么就攤上這事劝篷。” “怎么了民宿?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵娇妓,是天一觀的道長。 經(jīng)常有香客問我活鹰,道長哈恰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任志群,我火速辦了婚禮蕊蝗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赖舟。我一直安慰自己蓬戚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布宾抓。 她就那樣靜靜地躺著子漩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪石洗。 梳的紋絲不亂的頭發(fā)上幢泼,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音讲衫,去河邊找鬼缕棵。 笑死孵班,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的招驴。 我是一名探鬼主播篙程,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼别厘!你這毒婦竟也來了虱饿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤触趴,失蹤者是張志新(化名)和其女友劉穎氮发,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冗懦,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爽冕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了披蕉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颈畸。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚣艇,靈堂內(nèi)的尸體忽然破棺而出承冰,到底是詐尸還是另有隱情华弓,我是刑警寧澤食零,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站寂屏,受9級(jí)特大地震影響贰谣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迁霎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一吱抚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧考廉,春花似錦秘豹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涮坐,卻和暖如春凄贩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱讹。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工疲扎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓椒丧,卻偏偏與公主長得像壹甥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓜挽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 一盹廷、紋理綜述 物理世界中,視域內(nèi)的顏色會(huì)發(fā)生快速的變化久橙。你可以看到很多物體表面都會(huì)呈現(xiàn)出豐富的顏色俄占,并且在狹小的面...
    凡幾多閱讀 1,023評(píng)論 1 5
  • 一、原始圖像數(shù)據(jù) 圖像存儲(chǔ)空間 = 圖像的?高度 * 圖像寬度 * 每個(gè)像素的字節(jié)數(shù) 例子:RGB(8位),寬度:...
    king_jensen閱讀 535評(píng)論 0 1
  • 1.從TGA?文件中讀取像素圖 GLbyte *gltReadTGABits(const char *szFile...
    如意神王閱讀 1,830評(píng)論 0 1
  • 本文首發(fā)于個(gè)人博客:Lam's Blog - 【OpenGL-ES】二維紋理淆衷,文章由MarkDown語法編寫缸榄,可能...
    格子林ll閱讀 3,751評(píng)論 0 9
  • 紋理的基礎(chǔ)知識(shí) 2D 紋理 2d紋理是OpenGlES中最基礎(chǔ)和普遍的一種紋理結(jié)構(gòu)。一個(gè)2d紋理祝拯,就是圖片的數(shù)據(jù)的...
    Zsj_Sky閱讀 5,385評(píng)論 0 8