OpenGL- 紋理及相關(guān)API

一、什么是紋理?

藝術(shù)家和程序員更喜歡使用紋理(Texture)。紋理是一個(gè)2D圖片(甚至也有1D和3D的紋理),它可以用來(lái)添加物體的細(xì)節(jié);你可以想象紋理是一張繪有磚塊的紙,無(wú)縫折疊貼合到你的3D的房子上,這樣你的房子看起來(lái)就像有磚墻外表了。因?yàn)槲覀兛梢栽谝粡垐D片上插入非常多的細(xì)節(jié),這樣就可以讓物體非常精細(xì)而不用指定額外的頂點(diǎn)。

除了圖像以外,紋理也可以被用來(lái)儲(chǔ)存大量的數(shù)據(jù),這些數(shù)據(jù)可以發(fā)送到著色器上,但是這不是我們現(xiàn)在的主題。


image

為了能夠把紋理映射(Map)到三角形上,我們需要指定三角形的每個(gè)頂點(diǎn)各自對(duì)應(yīng)紋理的哪個(gè)部分。這樣每個(gè)頂點(diǎn)就會(huì)關(guān)聯(lián)著一個(gè)紋理坐標(biāo)(Texture Coordinate),用來(lái)標(biāo)明該從紋理圖像的哪個(gè)部分采樣(采集片段顏色)。之后在圖形的其它片段上進(jìn)行片段插值(Fragment Interpolation)。

紋理坐標(biāo)在x和y軸上,范圍為0到1之間(注意我們使用的是2D紋理圖像)。使用紋理坐標(biāo)獲取紋理顏色叫做采樣(Sampling)。紋理坐標(biāo)起始于(0, 0),也就是紋理圖片的左下角,終始于(1, 1),即紋理圖片的右上角。下面的圖片展示了我們是如何把紋理坐標(biāo)映射到三角形上的。

image

我們?yōu)槿切沃付?個(gè)紋理坐標(biāo)點(diǎn)。如上圖所示,我們希望三角形的左下角對(duì)應(yīng)紋理的左下角,因此我們把三角形左下角頂點(diǎn)的紋理坐標(biāo)設(shè)置為(0, 0);三角形的上頂點(diǎn)對(duì)應(yīng)于圖片的上中位置所以我們把它的紋理坐標(biāo)設(shè)置為(0.5, 1.0);同理右下方的頂點(diǎn)設(shè)置為(1, 0)。我們只要給頂點(diǎn)著色器傳遞這三個(gè)紋理坐標(biāo)就行了,接下來(lái)它們會(huì)被傳片段著色器中,它會(huì)為每個(gè)片段進(jìn)行紋理坐標(biāo)的插值。

紋理坐標(biāo)看起來(lái)就像這樣:

float texCoords[] = {
    0.0f, 0.0f, // 左下角
    1.0f, 0.0f, // 右下角
    0.5f, 1.0f // 上中
};

二、圖像存儲(chǔ)

  • 圖像的大小和圖片本身是有直接關(guān)系的
圖像存儲(chǔ)空間 = 圖像的高度 * 圖像寬度 * 每個(gè)像素的字節(jié)數(shù)
  • 改變、恢復(fù)像素存儲(chǔ)?方式
    API如下:
void glPixelStorei(GLenum pname,GLint param);
void glPixelStoref(GLenum pname,GLfloat param);

參數(shù)說(shuō)明
pname:GL_UNPACK_ALIGNMENT 指定 OpenGL 如何從數(shù)據(jù)緩存區(qū)中解包圖像
param:表示參數(shù)GL_UNPACK_ALIGNMENT 設(shè)置的值,允許設(shè)置為
1: byte排列
2: 排列為偶數(shù)byte的?
4: 字word排列
8: 行從雙字節(jié)邊界開(kāi)始

這倆函數(shù)用途是一樣的,只不過(guò)函數(shù)名一個(gè)是 i 結(jié)尾,一個(gè)是 f 結(jié)尾,區(qū)別只是第二個(gè)參數(shù)的類型,i 的是 GLint,f 的是 GLfloat。

  • 從顏色緩存區(qū)內(nèi)容作為像素圖直接讀取
    API 如下:
void glReadPixels(GLint x,GLint y,GLSizei width,GLSizei height, GLenum format, GLenum type,const void * pixels);

參數(shù)說(shuō)明
x:矩形左下角的窗?坐標(biāo)
y:矩形左下?的窗口坐標(biāo)
width:矩形的寬,以像素為單位
height:矩形的?,以像素為單位
format:OpenGL 的像素格式,參考 表2-1
type:解釋參數(shù) pixels 指向的數(shù)據(jù),告訴 OpenGL 使?用緩存區(qū)中的什么,數(shù)據(jù)類型來(lái)存儲(chǔ)顏色分量,像素?cái)?shù)據(jù)的數(shù)據(jù)類型 。參考 表2-2
pixels:指向圖形數(shù)據(jù)的指針

三、紋理相關(guān)API:

1. 載?紋理

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

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

void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

相關(guān)參數(shù):

  • target: 紋理維度 GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
  • Level: 指定所加載的mip貼圖層次。?一般我們都把這個(gè)參數(shù)設(shè)置為 0。
  • internalformat: 每個(gè)紋理單元中存儲(chǔ)多少顏色成分。(從讀取像素圖時(shí)獲得)
  • width、height、depth 參數(shù): 指加載紋理的寬度、?度、深度。注意! 這些值必須是 2 的整數(shù)次方。(這是因?yàn)?OpenGL 舊版本上的遺留下的?個(gè)要求。當(dāng)然現(xiàn)在已經(jīng)可以?持不是 2 的整數(shù)次方。但是開(kāi)發(fā)者們還是習(xí)慣使?用以 2 的整數(shù)次方去設(shè)置這些參數(shù)。)
  • border 參數(shù): 允許為紋理理貼圖指定?一個(gè)邊界寬度。
  • format 參數(shù): 像素?cái)?shù)據(jù)的數(shù)據(jù)類型(GL_UNSIGNED_BYTE,每個(gè)顏色分量都是一個(gè) 8 位無(wú)符號(hào)整數(shù))
  • type 參數(shù):
  • data 參數(shù): 指向紋理圖像數(shù)據(jù)的指針

2. 更新紋理

更新一個(gè)紋理圖像常常要比直接使用 glTexImage 重新加載一個(gè)新紋理快得多。用于完成這個(gè)任務(wù)的函數(shù)就是 glTexSubImage,它同樣有3 個(gè)變型。

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);

參數(shù)說(shuō)明
絕大部分參數(shù)都與 glTexImage 函數(shù)的參數(shù)準(zhǔn)確地對(duì)應(yīng)。xOffset、yOffsetzOffset 參數(shù)指定了在原來(lái)的紋理貼圖中開(kāi)始替換紋理數(shù)據(jù)的偏移量。width、height** 和depth` 參數(shù)指定了“插入”到原來(lái)那個(gè)紋理中的新紋理的寬度、高度和深度。

3. 插入替換紋理

下面這組函數(shù)允許我們從顏色緩沖區(qū)讀取紋理,并插入或替換原來(lái)紋理的一部分。下面這組函數(shù)都是 glCopyTexSubImage 函數(shù)的變型。

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);

注意:
這里并沒(méi)有 glCopyTexImage 函數(shù)。這是因?yàn)轭伾彌_區(qū)是 2D 的,不存在一種對(duì)應(yīng)的方法來(lái)將一副 2D 彩色圖像作為一個(gè) 3D 紋理的來(lái)源。但是,我們可以使用 glCopyTexSubImage3D 函數(shù),在一個(gè)三維紋理中使用顏色緩沖區(qū)的數(shù)據(jù)來(lái)設(shè)置它的一個(gè)紋理單元平面。

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

一維和二維紋理也可以從顏色緩沖區(qū)加載數(shù)據(jù)。我們可以從顏色緩沖區(qū)讀取一幅圖像,并通過(guò)下面這兩個(gè)函數(shù)將它作為一個(gè)新的紋理使用

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);

5. 紋理對(duì)象

1)分配紋理對(duì)象
glGenTextures函數(shù)首先需要輸入生成紋理的數(shù)量,然后把它們儲(chǔ)存在第二個(gè)參數(shù)的unsigned int數(shù)組中。

void glGenTextures (GLsizei n, GLuint *textures);

2)綁定紋理
創(chuàng)建了紋理之后,我們需要綁定它,讓之后任何的紋理指令都可以配置當(dāng)前綁定的紋理。

void glBindTexture (GLenum target, GLuint texture);

參數(shù)說(shuō)明

  • target: GL_TEXTURE_1DGL_TEXTURE_2D、GL_TEXTURE_3D
  • texture: 需要綁定的紋理對(duì)象

3)刪除綁定的紋理對(duì)象

void glDeleteTextures (GLsizei n, const GLuint *textures);

參數(shù)說(shuō)明

  • n: 紋理理對(duì)象
  • textures: 紋理理對(duì)象指針(指針指向一個(gè)?無(wú)符號(hào)整形數(shù)組,由紋理對(duì)象標(biāo)識(shí)符填充)。

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

GLboolean glIsTexture(GLuint texture)

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

很多參數(shù)的應(yīng)用都會(huì)影響渲染的規(guī)則和紋理貼圖的行為。這些紋理參數(shù)都是通過(guò) glTexParameter 函數(shù)的變量進(jìn)行設(shè)置的。

void glTexParameterf (GLenum target, GLenum pname, GLfloat param);
void glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
void glTexParameteri (GLenum target, GLenum pname, GLint param);
void glTexParameteriv (GLenum target, GLenum pname, const GLint *params);

參數(shù)說(shuō)明

  • target,指定這些參數(shù)將要應(yīng)?在哪個(gè)紋理模式上,?如 GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
  • pname,指定了需要設(shè)置哪個(gè)紋理參數(shù)
  • param 或 params,用于設(shè)置特定的紋理參數(shù)的值

7、紋理環(huán)繞方式

紋理坐標(biāo)的范圍通常是從(0, 0)到(1, 1),那如果我們把紋理坐標(biāo)設(shè)置在范圍之外會(huì)發(fā)生什么?OpenGL默認(rèn)的行為是重復(fù)這個(gè)紋理圖像(我們基本上忽略浮點(diǎn)紋理坐標(biāo)的整數(shù)部分),但OpenGL提供了更多的選擇:

環(huán)繞方式 描述
GL_REPEAT 對(duì)紋理的默認(rèn)行為。重復(fù)紋理圖像。
GL_MIRRORED_REPEAT 和GL_REPEAT 一樣,但每次重復(fù)圖片是鏡像放置的。
GL_CLAMP_TO_EDGE 紋理坐標(biāo)會(huì)被約束在0到1之間,超出的部分會(huì)重復(fù)紋理坐標(biāo)的邊緣,產(chǎn)生一種邊緣被拉伸的效果。
GL_CLAMP_TO_BORDER 超出的坐標(biāo)為用戶指定的邊緣顏色。

當(dāng)紋理坐標(biāo)超出默認(rèn)范圍時(shí),每個(gè)選項(xiàng)都有不同的視覺(jué)效果輸出。我們來(lái)看看這些紋理圖像的例子:

環(huán)繞方式

前面提到的每個(gè)選項(xiàng)都可以使用glTexParameter函數(shù)對(duì)單獨(dú)的一個(gè)坐標(biāo)軸設(shè)置(s、t(如果是使用3D紋理那么還有一個(gè)r)它們和x、yz是等價(jià)的):

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

第一個(gè)參數(shù)指定了紋理目標(biāo);我們使用的是2D紋理,因此紋理目標(biāo)是GL_TEXTURE_2D。第二個(gè)參數(shù)需要我們指定設(shè)置的選項(xiàng)與應(yīng)用的紋理軸。我們打算配置的是WRAP選項(xiàng),并且指定ST軸。最后一個(gè)參數(shù)需要我們傳遞一個(gè)環(huán)繞方式(Wrapping),在這個(gè)例子中OpenGL會(huì)給當(dāng)前激活的紋理設(shè)定紋理環(huán)繞方式為GL_MIRRORED_REPEAT。

如果我們選擇GL_CLAMP_TO_BORDER選項(xiàng),我們還需要指定一個(gè)邊緣的顏色。這需要使用glTexParameter函數(shù)的fv后綴形式,用GL_TEXTURE_BORDER_COLOR作為它的選項(xiàng),并且傳遞一個(gè)float數(shù)組作為邊緣的顏色值:

float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

8. 紋理過(guò)濾方式

紋理坐標(biāo)不依賴于分辨率(Resolution),它可以是任意浮點(diǎn)值,所以O(shè)penGL需要知道怎樣將紋理像素(Texture Pixel,也叫Texel,譯注1)映射到紋理坐標(biāo)。當(dāng)你有一個(gè)很大的物體但是紋理的分辨率很低的時(shí)候這就變得很重要了。你可能已經(jīng)猜到了,OpenGL也有對(duì)于紋理過(guò)濾(Texture Filtering)的選項(xiàng)。紋理過(guò)濾有很多個(gè)選項(xiàng),但是現(xiàn)在我們只討論最重要的兩種:GL_NEARESTGL_LINEAR。

GL_NEAREST(也叫鄰近過(guò)濾,Nearest Neighbor Filtering)是OpenGL默認(rèn)的紋理過(guò)濾方式。當(dāng)設(shè)置為GL_NEAREST的時(shí)候,OpenGL會(huì)選擇中心點(diǎn)最接近紋理坐標(biāo)的那個(gè)像素。下圖中你可以看到四個(gè)像素,加號(hào)代表紋理坐標(biāo)。左上角那個(gè)紋理像素的中心距離紋理坐標(biāo)最近,所以它會(huì)被選擇為樣本顏色:

臨近過(guò)濾

GL_LINEAR(也叫線性過(guò)濾,(Bi)linear Filtering)它會(huì)基于紋理坐標(biāo)附近的紋理像素,計(jì)算出一個(gè)插值,近似出這些紋理像素之間的顏色。一個(gè)紋理像素的中心距離紋理坐標(biāo)越近,那么這個(gè)紋理像素的顏色對(duì)最終的樣本顏色的貢獻(xiàn)越大。下圖中你可以看到返回的顏色是鄰近像素的混合色:

線性過(guò)濾

那么這兩種紋理過(guò)濾方式有怎樣的視覺(jué)效果呢?讓我們看看在一個(gè)很大的物體上應(yīng)用一張低分辨率的紋理會(huì)發(fā)生什么吧(紋理被放大了,每個(gè)紋理像素都能看到):

對(duì)比

GL_NEAREST產(chǎn)生了顆粒狀的圖案,我們能夠清晰看到組成紋理的像素,而GL_LINEAR能夠產(chǎn)生更平滑的圖案,很難看出單個(gè)的紋理像素。GL_LINEAR可以產(chǎn)生更真實(shí)的輸出,但有些開(kāi)發(fā)者更喜歡8-bit風(fēng)格,所以他們會(huì)用GL_NEAREST選項(xiàng)。

當(dāng)進(jìn)行放大(Magnify)和縮小(Minify)操作的時(shí)候可以設(shè)置紋理過(guò)濾的選項(xiàng),比如你可以在紋理被縮小的時(shí)候使用鄰近過(guò)濾,被放大時(shí)使用線性過(guò)濾。我們需要使用glTexParameter函數(shù)為放大和縮小指定過(guò)濾方式。這段代碼看起來(lái)會(huì)和紋理環(huán)繞方式的設(shè)置很相似:

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

9.多級(jí)漸遠(yuǎn)紋理(Mipmap)

想象一下,假設(shè)我們有一個(gè)包含著上千物體的大房間,每個(gè)物體上都有紋理。有些物體會(huì)很遠(yuǎn),但其紋理會(huì)擁有與近處物體同樣高的分辨率。由于遠(yuǎn)處的物體可能只產(chǎn)生很少的片段,OpenGL從高分辨率紋理中為這些片段獲取正確的顏色值就很困難,因?yàn)樗枰獙?duì)一個(gè)跨過(guò)紋理很大部分的片段只拾取一個(gè)紋理顏色。在小物體上這會(huì)產(chǎn)生不真實(shí)的感覺(jué),更不用說(shuō)對(duì)它們使用高分辨率紋理浪費(fèi)內(nèi)存的問(wèn)題了。

OpenGL使用一種叫做多級(jí)漸遠(yuǎn)紋理(Mipmap)的概念來(lái)解決這個(gè)問(wèn)題,它簡(jiǎn)單來(lái)說(shuō)就是一系列的紋理圖像,后一個(gè)紋理圖像是前一個(gè)的二分之一。多級(jí)漸遠(yuǎn)紋理背后的理念很簡(jiǎn)單:距觀察者的距離超過(guò)一定的閾值,OpenGL會(huì)使用不同的多級(jí)漸遠(yuǎn)紋理,即最適合物體的距離的那個(gè)。由于距離遠(yuǎn),解析度不高也不會(huì)被用戶注意到。同時(shí),多級(jí)漸遠(yuǎn)紋理另一加分之處是它的性能非常好。讓我們看一下多級(jí)漸遠(yuǎn)紋理是什么樣子的:

多級(jí)漸遠(yuǎn)紋理

手工為每個(gè)紋理圖像創(chuàng)建一系列多級(jí)漸遠(yuǎn)紋理很麻煩,幸好OpenGL有一個(gè)glGenerateMipmaps函數(shù),在創(chuàng)建完一個(gè)紋理后調(diào)用它OpenGL就會(huì)承擔(dān)接下來(lái)的所有工作了。后面的教程中你會(huì)看到該如何使用它。

在渲染中切換多級(jí)漸遠(yuǎn)紋理級(jí)別(Level)時(shí),OpenGL在兩個(gè)不同級(jí)別的多級(jí)漸遠(yuǎn)紋理層之間會(huì)產(chǎn)生不真實(shí)的生硬邊界。就像普通的紋理過(guò)濾一樣,切換多級(jí)漸遠(yuǎn)紋理級(jí)別時(shí)你也可以在兩個(gè)不同多級(jí)漸遠(yuǎn)紋理級(jí)別之間使用NEARESTLINEAR過(guò)濾。為了指定不同多級(jí)漸遠(yuǎn)紋理級(jí)別之間的過(guò)濾方式,你可以使用下面四個(gè)選項(xiàng)中的一個(gè)代替原有的過(guò)濾方式:

過(guò)濾方式 描述
GL_NEAREST 在Mip基層上執(zhí)?最鄰近過(guò)濾
GL_LINEAR 在Mip基層執(zhí)?線性過(guò)濾
GL_NEAREST_MIPMAP_NEAREST 使用最鄰近的多級(jí)漸遠(yuǎn)紋理來(lái)匹配像素大小,并使用鄰近插值進(jìn)行紋理采樣
GL_LINEAR_MIPMAP_NEAREST 使用最鄰近的多級(jí)漸遠(yuǎn)紋理級(jí)別,并使用線性插值進(jìn)行采樣
GL_NEAREST_MIPMAP_LINEAR 在兩個(gè)最匹配像素大小的多級(jí)漸遠(yuǎn)紋理之間進(jìn)行線性插值,使用鄰近插值進(jìn)行采樣
GL_LINEAR_MIPMAP_LINEAR 在兩個(gè)鄰近的多級(jí)漸遠(yuǎn)紋理之間使用線性插值,并使用線性插值進(jìn)行采樣

就像紋理過(guò)濾一樣,我們可以使用glTexParameteri將過(guò)濾方式設(shè)置為前面四種提到的方法之一:

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

一個(gè)常見(jiàn)的錯(cuò)誤是,將放大過(guò)濾的選項(xiàng)設(shè)置為多級(jí)漸遠(yuǎn)紋理過(guò)濾選項(xiàng)之一。這樣沒(méi)有任何效果,因?yàn)槎嗉?jí)漸遠(yuǎn)紋理主要是使用在紋理被縮小的情況下的:紋理放大不會(huì)使用多級(jí)漸遠(yuǎn)紋理,為放大過(guò)濾設(shè)置多級(jí)漸遠(yuǎn)紋理的選項(xiàng)會(huì)產(chǎn)生一個(gè)GL_INVALID_ENUM錯(cuò)誤代碼。

10.壓縮紋理

  • 通?壓縮紋理格式:
壓縮格式 基本內(nèi)部格式
GL_COMPRESSED_RGB GL_RGB
GL_COMPRESSED_RGBA GL_RGBA
GL_COMPRESSED_SRGB GL_RGB
GL_COMPRESSED_SRGB_ALPHA GL_RGBA
GL_COMPRESSED_RED GL_RED
GL_COMPRESSED_RG GL_RG
  • 判斷壓縮與選擇壓縮方式
//根據(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);
  • 加載壓縮紋理
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);

參數(shù)說(shuō)明

  • target:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
  • Level:指定所加載的mip貼圖層次。?般我們都把這個(gè)參數(shù)設(shè)置為0。
  • internalformat:每個(gè)紋理單元中存儲(chǔ)多少顏?色成分。
  • width、height、depth參數(shù):指加載紋理的寬度、?度、深度。==注意!==這些值必須是2的整次?。(這是因?yàn)镺penGL舊版本上的遺留下的?一個(gè)要求。當(dāng)然現(xiàn)在已經(jīng)可以?持不是2的整數(shù)次方。但是開(kāi)發(fā)者們還是習(xí)慣使用以2的整次方去添加參數(shù)。)
  • border參數(shù):允許為紋理理貼圖指定?一個(gè)邊界寬度。
  • format、type、data參數(shù):與我們?cè)谥vglDrawPixels 函數(shù)對(duì)于的參數(shù)相同
  • glGetTexLevelParameter函數(shù)提取的壓縮紋理格式
參數(shù) 返回
GL_TEXTURE_COMPRESSED 如果紋理被壓縮,返回1,否則返回0
GL_TEXTURE_COMPRESSED_IMAGE_SIZE 壓縮后的紋理的?小(以字節(jié)為單位
GL_TEXTURE_INTERNAL_FORMAT 所使?的壓縮格式
GL_NUM_COMPRESSED_TEXTURE_FORMATS 受?持的壓縮紋理格式數(shù)量
GL_COMPRESSED_TEXTURE_FORMATS ?個(gè)包含了?些常量值的數(shù)組,每個(gè)常量值對(duì)應(yīng)于?種受?持的壓縮紋理格式
GL_TEXTURE_COMPRESSION_HINT 壓縮紋理提示的值(GL/NICEST/GL_FASTEST)
  • GL_EXT_texture_compression_s3tc壓縮格式
格式 描述
GL_COMPRESSED_RGB_S3TC_DXT1 RGB數(shù)據(jù)被壓縮,alpha值始終是1.0
GL_COMPRESSED_RGBA_S3TC_DXT1 RGBA數(shù)據(jù)被壓縮,alpha值返回1.0或者0.0
GL_COMPRESSED_RGAB_S3TC_DXT3 RGB值被壓縮,alpha值?用4位存儲(chǔ)
GL_COMPRESSED_RGBA_SETC_DXT5 RGB數(shù)據(jù)被壓縮,alpha值是?一些8位值的加權(quán)平均值

覺(jué)得不錯(cuò)記得點(diǎn)贊哦!聽(tīng)說(shuō)看完點(diǎn)贊的人逢考必過(guò),逢獎(jiǎng)必中。?( ′???` )比心

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容