日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

纹理映射 【转】

發(fā)布時(shí)間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 纹理映射 【转】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

9.4 紋理對(duì)象

使用紋理對(duì)象來(lái)存儲(chǔ)紋理數(shù)據(jù)的步驟:
1) 生成紋理對(duì)象名稱
2) 將紋理對(duì)象綁定到紋理數(shù)據(jù)(包括圖像數(shù)據(jù)數(shù)組和紋理屬性), 即創(chuàng)建紋理對(duì)象.
3) 如果OpenGL實(shí)現(xiàn)高性能紋理工作集, 應(yīng)檢查是否有足夠的空間來(lái)存儲(chǔ)所有的紋理對(duì)象. 如沒(méi)有足夠空間, 應(yīng)設(shè)置每個(gè)紋理對(duì)象的優(yōu)先級(jí), 以確保最常用的紋理留在工作集中
4) 綁定和重新綁定紋理對(duì)象, 以便可以將其中的紋理映射到物體上.

9.4.1 生成紋理對(duì)象名稱

void glGenTextures(GLsizei n, GLint* textureNames);
功能: 通過(guò)數(shù)組textureNames返回n個(gè)未用的紋理對(duì)象名, 返回的名稱不必是相鄰的整數(shù).
GLboolean glIsTexture(GLint textureName);
功能: 如textureName是已被綁定的紋理對(duì)象名, 且沒(méi)有被刪除, 則返回GL_TRUE, 如textureName為0, 或非0, 但不是已有紋理對(duì)象的名稱, 返回GL_FALSE.
注意: 如一倍glGenTextures()返回, 但未使用glBindTextures()綁定, 仍返回GL_FALSE.

9.4.2 創(chuàng)建和使用紋理對(duì)象

void glBindTexture(GLenum target, GLuint textureName);
功能: 完成下面幾項(xiàng)工作.
1) 如textureName為非零無(wú)符號(hào)整數(shù), 首次被使用, 則創(chuàng)建一新的紋理對(duì)象, 并將其名稱設(shè)置為參數(shù)textureName的值.
2) 綁定一個(gè)已創(chuàng)建的紋理對(duì)象時(shí), 該紋理對(duì)象將進(jìn)入活動(dòng)狀態(tài).
3) 如textureName為0, OpenGL將停止使用紋理對(duì)象, 返回到未命名的默認(rèn)紋理.
4) 首次被創(chuàng)建時(shí), target指定了維數(shù), 其取值為GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D 或 GL_TEXTURE_CUBE_MAP.
5) 首次被創(chuàng)建時(shí), 諸如縮小濾波方法, 放大濾波方法, 環(huán)繞模式, 邊框顏色, 紋理優(yōu)先級(jí)等紋理屬性被設(shè)置為默認(rèn)值.
例 9.7 綁定紋理對(duì)象: tebind.c

紋理駐留策略

如果有多個(gè)使用周期較短且大小相同的紋理, 可以調(diào)用函數(shù)glTexSubImage*()將不同的圖像加載到已有的紋理對(duì)象中.與刪除并重新創(chuàng)建紋理對(duì)象相比, 這樣做的效率可能更高
void glPrioritiesTextures(GLsizei n, const GLuint *textureNames, const GLclampf *priorities);
功能: 將n個(gè)紋理對(duì)象的優(yōu)先級(jí)設(shè)置為指定的值, 數(shù)組textureNames指定了這些紋理對(duì)象的名稱, 數(shù)組priorities指定了優(yōu)先級(jí).
priorities: 指定了優(yōu)先級(jí), 將其值截取到[0.0, 1.0], 0對(duì)應(yīng)的優(yōu)先級(jí)最低, 1對(duì)應(yīng)的優(yōu)先級(jí)最高
函數(shù)glPrioritiesTextures()步要求textureNames中指定的紋理對(duì)象被綁定過(guò).
函數(shù)glTexParameter*()也可用于設(shè)置單個(gè)紋理對(duì)象的優(yōu)先級(jí). 但僅限于當(dāng)前綁定的紋理對(duì)象.

9.4.5 紋理函數(shù)

void glTexEnv(if)(GLenum target, GLenum pname, TYPE param);
void glTexEnv(if)v(GLenum target, GLenum pname, TYPE* param);

功能: 設(shè)置當(dāng)前的紋理映射方式.
target: 必須為GL_TEXTURE_FILTER_CONTROL或GL_TEXTURE_ENV
pname: 如target為GL_TEXTURE_FILTER_CONTROL, pname必須為GL_TEXTURE_LOD_BIAS.
?????? 如target為GL_TEXTURE_ENV, pname可為GL_TEXTURE_ENV_MODE, GL_TEXTURE_ENV_COLOR
param: 如pname為GL_TEXTURE_LOD_BIAS, param是一個(gè)浮點(diǎn)數(shù), 用于指定GL_TEXTURE_LOD_BIAS的值.
?????? 如pname為GL_TEXTURE_ENV_MODE,param的取值為GL_DECAL,GL_REPLACE,GL_MODULATE,GL_BLEND, GL_ADD或GL_COMBINE. 指定了如何將紋理值和片元的顏色值合并起來(lái).
?????? 如pname為GL_TEXTURE_ENV_COLOR, 則參數(shù)pname是一個(gè)包含4個(gè)浮點(diǎn)數(shù)的數(shù)組, 這4個(gè)元素分別是R, G, B, A分量, 指定了一種用于GL_BLEND操作的顏色.
紋理映射方式和基本內(nèi)部結(jié)構(gòu)一起決定了如何應(yīng)用紋素?cái)?shù)據(jù)的各個(gè)分量.
紋理映射方式作用于被選擇的紋素?cái)?shù)據(jù)分量和片元的顏色值.
函數(shù)glTexImage*D()指定紋理圖像時(shí), 第三個(gè)參數(shù)指定了紋理的內(nèi)部格式. 有6種基本內(nèi)部格式:
GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_RGB, GL_RGBA.
其他內(nèi)部結(jié)構(gòu)如GL_LUMINANCE6_ALPHA2和GL_R3_G3_B2, 對(duì)應(yīng)于6種基本內(nèi)部格式之一. 它們指定紋素?cái)?shù)據(jù)分量的精度.
紋理映射計(jì)算是以RGBA方式進(jìn)行的, 但有些內(nèi)部格式不是RGB.
將各種紋理格式轉(zhuǎn)換為顏色值:
基本內(nèi)部結(jié)構(gòu)?????????? 轉(zhuǎn)換得到的RGBA顏色值
GL_ALPHA?????????? (0, 0, 0, A)
GL_LUMINANCE?????????? (1, 1, 1, 1)
GL_LUMINANCE_ALPHA?????? (1, 1, 1, A)
GL_INTENSITY?????????? (1, 1, 1, 1)
GL_RGB?????????????? (R, G, B, 1)
GL_RGBA?????????????? (R, G, B, A)
紋理映射方式替換, 調(diào)整和貼花

基本內(nèi)部格式
GL_REPLACE
GL_MODULATE
GL_DECAL

GL_ALPHA
C = Cf
A = As
C = Cf
A = AfAs
未定義

GL_LUMINANCE
C = Cf(1 - Cs) + CcCs
A = Af
C = Cf + Cs
A = Af
未定義

GL_LUMINANCE_ALPHA
C = Cf(1 - Cs) + CcCs
A = AfAs
C = Cf + Cs
A = AfAs
未定義

GL_INTENSITY
C = Cf(1 - Cs) + CcCs
A = Af(1 - As) + AcAs
C = Cf + Cs
A = Af + As
未定義

GL_RGB
C = Cf(1 - Cs) + CcCs
A = Af
C = Cf + Cs
A = Af
C = Cs
A = Af

GL_RGBA
C = Cf(1 - Cs) + CcCs
A = AfAs
C = Cf + Cs
A = AfAs
C = Cf(1-As) + CsAs
A = Af

紋理映射方式混合和相加

基本內(nèi)部格式
GL_BLEND
GL_ADD

GL_ALPHA
C = Cf
A = AfAs
C = Cf
A = AfAs

GL_LUMINANCE
C = Cf(1 - Cs) + CcCs
A = Af
C = Cf + Cs
A = Af

GL_LUMINANCE_ALPHA
C = Cf(1 - Cs) + CcCs
A = AfAs
C = Cf + Cs
A = AfAs

GL_INTENSITY
C = Cf(1 - Cs) + CcCs
A = Af(1 - As) + AcAs
C = Cf + Cs
A = Af + As

GL_RGB
C = Cf(1 - Cs) + CcCs
A = Af
C = Cf + Cs
A = Af

GL_RGBA
C = Cf(1 - Cs) + CcCs
A = AfAs
C = Cf + Cs
A = AfAs

各個(gè)下標(biāo)的含義如下:
s表示計(jì)算得到的紋理顏色
f表示片元值
c表示GL_TEXTURE_ENV_COLOR的值
沒(méi)有下標(biāo)的值表示通過(guò)計(jì)算得到的最終結(jié)果
紋理映射方式替換用紋理顏色替換片元的顏色,
紋理映射方式貼花類似于替換, 但它只適用于RGB和RGBA, 同時(shí)處理alpha的方式也不同.
內(nèi)部格式為RGBA時(shí), 紋理映射方式貼花將片元的顏色和紋理顏色混合起來(lái), 混合比率由紋理的alpha決定, 片元的alpha不變.
紋理映射方式調(diào)整根據(jù)紋理圖像的內(nèi)容對(duì)片元的顏色進(jìn)行調(diào)整.
內(nèi)部格式為GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY時(shí), 各顏色分量乘以相同的值, 調(diào)整后的顏色位于片元顏色和黑色之間.
內(nèi)部格式為GL_RGB和GL_RGBA時(shí), 片元顏色的各個(gè)分量與紋理中相應(yīng)的分量相乘, alpha值也同片元alpha相乘. 光照適合使用紋理映射方式調(diào)整.
紋理映射方式相加將紋理顏色和片元顏色相加, 如有alpha值, 其乘以片元的alpha值, 但內(nèi)部格式為GL_INTENSITY時(shí)除外.這種情況紋理alpha值與片元alpha值相加.
紋理映射方式混合是唯一一種使用GL_TEXTURE_ENV_COLOR指定的顏色的映射方式.
它像使用alpha值那樣使用輝度,強(qiáng)度或顏色值將片元顏色和GL_TEXTURE_ENV_COLOR指定的顏色混合.

9.5 指定紋理坐標(biāo)

紋理坐標(biāo)可包含1-4個(gè)分量, 這些分量通常被稱為s, t, r和q坐標(biāo).
一維紋理, 使用s坐標(biāo). 二維紋理, 使用s和t坐標(biāo), 三維紋理, 使用s, t和r坐標(biāo). q坐標(biāo)通常被設(shè)置為1, 用于創(chuàng)建齊次坐標(biāo).
void glTexCoord[1234][sifd](TYPE coords);
void glTexCoord[1234][sifd]v(TYPE* coords);

功能: 設(shè)置當(dāng)前的紋理坐標(biāo)(s,t,r,q),

9.5.1 計(jì)算合適的紋理坐標(biāo)

由于映射的格式與紋理格式不符,容易造成扭曲的情況,這次要選擇恰當(dāng)?shù)募y理坐標(biāo)來(lái)映射.

9.5.2 紋理的重復(fù)和截取

紋理坐標(biāo)被指定為范圍[0, 1]之外的值時(shí), 將截取紋理坐標(biāo)或重復(fù)紋理圖像.
也可以使用環(huán)繞模式"鏡像(mirrored)"重復(fù), 重復(fù)時(shí)翻轉(zhuǎn)紋理圖像.
例如: 在紋理坐標(biāo)范圍[0,1]內(nèi),俺原來(lái)順序使用紋理數(shù)據(jù), [1, 2]則相反順序使用紋理數(shù)據(jù), [2, 3]又按原來(lái)的順序使用, 依次類推
另一種環(huán)繞模式是截取紋理坐標(biāo): 將大于1.0的坐標(biāo)設(shè)置為1.0, 將小于0.0的坐標(biāo)設(shè)置為0.0.
如何使用紋理邊框顏色:
1) 如果環(huán)繞模式為GL_REPEAT, 總是忽略邊框. 從對(duì)側(cè)選擇一個(gè)2X2紋素陣列來(lái)計(jì)算加權(quán)平均.
2) 如果環(huán)繞模式為GL_CLAMP, 將邊框紋素(或GL_TEXTURE_BORDER_COLOR的值)用于計(jì)算2X2加權(quán)平均.
3) 如果環(huán)繞模式為GL_CLAMP_TO_EDGE, 總是忽略邊框. 使用紋理邊緣或靠近紋理邊緣的紋素被用于紋理計(jì)算, 但不使用邊框上的紋素.
4) 如果環(huán)繞模式為GL_CLAMP_TO_BORDER, 紋理坐標(biāo)超出了范圍[0, 1], 則只使用邊框紋素(如果沒(méi)有邊框, 使用邊框常量顏色)來(lái)計(jì)算紋理映射.
?? 在紋理坐標(biāo)的上限和下限附近, 可能將邊框紋素和內(nèi)部紋素作為樣本加入到2X2紋素陣列中.
環(huán)繞模式截取時(shí), 為避免曲面其他部分受紋理的影響, 紋理邊緣的紋素的alpha值設(shè)置為0,
示例: 環(huán)繞模式為GL_REPEAT, 紋理坐標(biāo)為 4.0上限

指定S和T方向重復(fù)環(huán)繞.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
如果GL_REPEAT改為GL_CLAMP, 則效果如下

如S方向?yàn)镚L_CLAMP, T方向?yàn)镚L_REPTEAT, 效果如下

void glTexParameter[if](GLenum target, GLenum pname, TYPE param);
void glTexParameter[if]v(GLenum target, GLenum pname, TYPE* param);

功能: 設(shè)定紋理如何處理片段或者如何存儲(chǔ)紋理對(duì)象

pname的取值
param的取值

GL_TEXTURE_WRAP_S
GL_CLAMP,GL_CLAMP_TO_BORDER, GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT, GL_REPEAT

GL_TEXTURE_WRAP_T
GL_CLAMP,GL_CLAMP_TO_BORDER, GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT, GL_REPEAT

GL_TEXTURE_WRAP_R
GL_CLAMP,GL_CLAMP_TO_BORDER, GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT, GL_REPEAT

GL_TEXTURE_MAG_FILTER
GL_NEAREST, GL_LINEAR

GL_TEXTURE_MIN_FILTER
GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST,
GL_NEAREST_MIPMAP_LINEAR,
GL_LINEAR_MIPMAP_NEAREST,
GL_LINEAR_MIPMAP_LINEAR

GL_TEXTURE_BORDER_COLOR
4個(gè)[0.0, 1.0]內(nèi)的任何值

GL_TEXTURE_PRIORITY
[0.0, 1.0]內(nèi)的任何值, 設(shè)置當(dāng)前紋理對(duì)象的優(yōu)先級(jí)

GL_TEXTURE_MIN_LOD
任何浮點(diǎn)數(shù)

GL_TEXTURE_MAX_LOD
任何浮點(diǎn)數(shù)

GL_TEXTURE_BASE_LEVEL
任何非負(fù)整數(shù)

GL_TEXTURE_MAX_LEVEL
任何非負(fù)整數(shù)

GL_DEPTH_TEXTURE_MODE
GL_LUMINANCE, GL_INTENSITY, GL_ALPHA

GL_TEXTURE_COMPARE_MODE
GL_NONE, GL_COMPARE_R_TO_TEXTURE

GL_TEXTURE_COMPARE_FUNC
GL_LEQUAL, GL_GEQUAL

GL_GENERATE_MIPMAP
GL_TRUE, GL_FALSE

GL_TEXTURE_BORDER_COLOR: 紋理映射計(jì)算使用的邊框信息.濾波方法為GL_NEAREST,環(huán)繞模式為GL_CLAMP_TO_BORDER時(shí), 邊框顏色影響貼上紋理的物體.
???????????????????????? 當(dāng)濾波方法為GL_LINEAR, 環(huán)繞模式為GL_CLAMP時(shí), 邊框也會(huì)影響紋理映射.
???????????????????????? 環(huán)繞模式為GL_CLAMP_TO_EDGE或GL_REPEAT, 邊框顏色將被忽略.

9.6 自動(dòng)生成紋理坐標(biāo)

void glTexGen[ifd](GLenum coord, GLenum pname, TYPE param);

void glTexGen[ifd]v(GLenum coord, GLenum pname, TYPE *param);

功能: 指定用于自動(dòng)生成紋理坐標(biāo)的函數(shù)(function).

coord: 必須是GL_S, GL_T, GL_R, GL_Q. 指出生成s, t, r還是q紋理坐標(biāo).

pname: 為GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, GL_EYE_PLANE

param: 如pname為GL_TEXTURE_GEN_MODE, param為一個(gè)整數(shù), 取值為GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP, GL_REFLECTION_MAP, GL_NORMAL_MAP

pname為其他值, param是一個(gè)指向數(shù)組的指針(向量版本), 數(shù)組中包含提供給紋理生成函數(shù)的參數(shù)值.

紋理圖像映射到固體物體上, 使用物體坐標(biāo)指定參考較合適. GL_OBJECT_LINEAR.

移動(dòng)的物體上生成動(dòng)態(tài)的等高線時(shí), 使用眼坐標(biāo)GL_EYE_LINEAR較合適.

球形環(huán)境映射用GL_SPHERE_MAP較合適.

立方圖用GL_NORMAL_MAP.

9.6.1 創(chuàng)建等高線

使用GL_TEXTURE_GEN_MODE 和 GL_OBJECT_LINEAR時(shí), 紋理生成函數(shù)是頂點(diǎn)的物體坐標(biāo)(x0, y0, z0, w0)的線性組合:

生成的坐標(biāo) = p1x0 + p2y0 + p3z0 + p4w0

其中p1,p2,p3,p4是參數(shù)pname為GL_OBJECT_PLANE時(shí), 參數(shù)param的值.如果p1, p2, p3和p4被歸一化, 計(jì)算的結(jié)果將是頂點(diǎn)到一個(gè)平面的距離.

例如: p2 = p3 = p4 = 0; p1 = 1, 計(jì)算結(jié)果為頂點(diǎn)到平面x = 0的距離.

例9.8 texgen.c

函數(shù)glEnable()使用參數(shù)GL_TEXTURE_GEN_S來(lái)啟用自動(dòng)生成紋理坐標(biāo)x.

函數(shù)glTexGen*()使用參數(shù)GL_OBJECT_LINEAR表示在模型的坐標(biāo)系下計(jì)算紋理坐標(biāo). GL_EYE_LINEAR表示在眼坐標(biāo)系下計(jì)算紋理坐標(biāo).

環(huán)境映射指的是渲染物體時(shí), 將其視為全反射的, 使其表面的顏色為周圍環(huán)境反射到人眼中的顏色.

實(shí)現(xiàn)環(huán)境映射需要做的只是創(chuàng)建一個(gè)合適的紋理圖, 并讓OpenGL生成紋理坐標(biāo).

創(chuàng)建了用于環(huán)境映射的紋理后, 需要啟用OpenGL的環(huán)境映射算法

自動(dòng)生成紋理坐標(biāo)以支持環(huán)境映射的代碼:

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

glEnable(GL_TEXTURE_GEN_S);

glEnable(GL_TEXTURE_GEN_T);

紋理映射方法GL_SPHERE_MAP生成合適的環(huán)境映射紋理坐標(biāo).

9.6.3 立方圖紋理(cube map texture)

使用6個(gè)二維紋理圖來(lái)構(gòu)成一個(gè)以原點(diǎn)為中心的紋理立方體.對(duì)于每個(gè)片元, 其紋理坐標(biāo)(s, r, t)被視為方向向量, 而紋素表示從原點(diǎn)看到的紋理立方體上的東西.

要?jiǎng)?chuàng)建立方圖紋理, 可調(diào)用glTexImage2D()6次, 每次調(diào)用該函數(shù)時(shí)使用參數(shù)target指定立方體的面

GL_TEXTURE_CLUB_MAP_POSITIVE_X, GL_TEXTURE_CLUB_MAP_NEGATIVE_X, GL_TEXTURE_CLUB_MAP_POSITIVE_Y, GL_TEXTURE_CLUB_MAP_NEGATIVE_Y,

GL_TEXTURE_CLUB_MAP_POSITIVE_Z, GL_TEXTURE_CLUB_MAP_NEGATIVE_Z

立方圖有專用的紋理代理 GL_PROXY_TEXTURE_CUB_MAP

應(yīng)將立方圖視為一個(gè)整體, 為其指定紋理參數(shù)和創(chuàng)建紋理對(duì)象, 而不是分別對(duì)6個(gè)禮方面指定紋理參數(shù)和創(chuàng)建紋理對(duì)象.

下述設(shè)置立方圖的環(huán)繞模式和濾波方法的代碼將參數(shù)target的值設(shè)置為GL_TEXTURE_CUBE_MAP

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

對(duì)于給定的片元, 根據(jù)紋理坐標(biāo)(s, t, r)中哪個(gè)坐標(biāo)值最大以及這個(gè)值的正負(fù)來(lái)決定使用哪個(gè)紋理,

前者決定主軸, 后者決定方向, 然后將其他兩個(gè)坐標(biāo)值除以最大坐標(biāo)值,得到新的坐標(biāo)(s',t'),并據(jù)此來(lái)決定使用前面選中的紋理中的哪些紋素.

通常是調(diào)用函數(shù)glTexGen*()來(lái)自動(dòng)生成立方圖紋理坐標(biāo), 并指定下述兩種紋理坐標(biāo)生成模式之一: GL_REFLECTION_MAP和GL_NORMAL_MAP.

GL_REFLECTION_MAP適用于環(huán)境映射.

GL_NORMAL_MAP適用于渲染有定位光源和漫反射的場(chǎng)景.使用模型視點(diǎn)矩陣將頂點(diǎn)的發(fā)現(xiàn)向量變換為眼坐標(biāo)(nx,ny,nz),并將其用作紋理坐標(biāo)(s, t, r)

生成立方圖紋理坐標(biāo)的代碼:

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_CUBE_MAP);

9.7 多重紋理

多重紋理讓你在紋理操作流水線中依次將多個(gè)紋理應(yīng)用于同一個(gè)多邊形.
1. 使用多重紋理的步驟
注意:在返回模式下使用多重紋理時(shí), 只有第一個(gè)紋理單元的操作結(jié)果是確定的.
1) 對(duì)于每個(gè)紋理單元, 指定其紋理映射參數(shù), 包括紋理圖像, 濾波方法, 映射方式, 紋理坐標(biāo)生成方式和紋理矩陣.
?? 函數(shù)glGetIntegerv()使用參數(shù)GL_MAX_TEXTURE_UNITS 來(lái)了解OpenGL實(shí)現(xiàn)最多支持多少個(gè)紋理單元.
2) 指定頂點(diǎn)時(shí), 使用函數(shù)glMultiTexCoord*()為每個(gè)頂點(diǎn)指定多組紋理坐標(biāo).每個(gè)紋理單元都需要一組坐標(biāo).每個(gè)紋理單元使用的坐標(biāo)可能各不相同.
2. 建立紋理單元
使用多重紋理時(shí), 需要有多個(gè)紋理單元. 每個(gè)紋理單元的功能都相同, 并存儲(chǔ)了各自的紋理處理參數(shù).包括:
1)紋理圖像 2)濾波參數(shù) 3)紋理映射方式 4)紋理矩陣堆棧 5)紋理坐標(biāo)生成模式 6)頂點(diǎn)數(shù)組(如果需要的話)
要設(shè)置紋理映射參數(shù), 使用函數(shù)glActiveTexture()來(lái)指定要對(duì)其進(jìn)行設(shè)置的紋理單元,
然后調(diào)用函數(shù)glTexImage*(), glTexParameter*(), glTexEnv*(), glTexGen*()和glBindTexture()來(lái)設(shè)置其紋理映射參數(shù).
void glActiveTexture(GLenum texUnit);
功能: 選擇一個(gè)紋理單元, 接下來(lái)的紋理函數(shù)將修改該紋理單元.
texUnit: 為符號(hào)常量GL_TEXTUREi,其中i的取值范圍為0到k-1, k是OpenGL實(shí)現(xiàn)支持的最大紋理單元數(shù).

3. 指定頂點(diǎn)及其紋理坐標(biāo)
void glMultiTexCoord(1234)(sifd)(GLenum texUnit, TYPE coords);
void glMultiTexCoord(1234)v(sifd)(GLenum texUnit, TYPE* coords);

功能: 將參數(shù)coords中的紋理坐標(biāo)(s, i, r, q)用于紋理單元texUnit, 參數(shù)texUnit的取值與函數(shù)glActiveTexture()中相同.
對(duì)位圖或圖像使用多重紋理時(shí), 需要為每個(gè)光柵位置指定多組紋理坐標(biāo).
因此,每次調(diào)用函數(shù)glRasterPos*()或glWindowPos*()時(shí), 為每個(gè)紋理單元調(diào)用函數(shù)glMultiTexCoord*().
4. 其他指定紋理坐標(biāo)的方法
1) 自動(dòng)生成紋理坐標(biāo)(函數(shù)glTexGen*())
?? 使用函數(shù)glActiveTexture()來(lái)指定下面紋理坐標(biāo)生成函數(shù)影響哪個(gè)紋理單元 glTexGen*(), glEnable(GL_TEXTURE_GEN_*), glDisable(GL_TEXTURE_GEN_*)
2) 使用頂點(diǎn)數(shù)組glTexCoordPointer()
?? 函數(shù)glClientActiveTexture()用于指出函數(shù)glTexCoordPointer()將為哪個(gè)紋理單元指定紋理坐標(biāo)
void glClientActiveTexture(GLenum texUnit);
?? 功能: 指定要用頂點(diǎn)數(shù)組為哪個(gè)紋理單元指定紋理坐標(biāo).
?? texUnit: 取值與glActiveTexture相同.
5. 恢復(fù)到使用單個(gè)紋理單元
對(duì)處紋理單元0之外的所有紋理單元禁用紋理映射功能.

9.8 紋理組合函數(shù)

void glTexEnv[if](GLenum target, GLenum pname, TYPE param);
void glTexEnv[if]v(GLenum target, GLenum pname, TYPE* param);

功能: 設(shè)置當(dāng)前紋理映射方式
target: 必須為GL_TEXTURE_FILTER_CONTROL 或 GL_TEXTURE_ENV.
pname: 如target為GL_TEXTURE_FILTER_CONTROL, pname必須為GL_TEXTURE_LOD_BIAS
param: pname為GL_TEXTURE_LOD_BIAS, param為浮點(diǎn)數(shù), 用于指定GL_TEXTURE_LOD_BIAS的值.
如果紋理映射方式為GL_BLEND, 將使用GL_TEXTURE_ENV_COLOR的值來(lái)與片元混合, 因此必須設(shè)置它.
如果紋理映射方式為GL_COMBINE, 還可能需要設(shè)置GL_COMBINE_RGB, GL_COMBINE_ALPHA, GL_RGB_SCALE 或 GL_ALPHA_SCALE.
如果設(shè)置了GL_COMBINE_RGB, 可能還需要設(shè)置參數(shù)GL_SOURCEi_RGB 和 GL_OPERANDi_RGB(其中i為0, 1, 2)的值.
如果設(shè)置了GL_COMBINE_ALPHA, 可能還需要設(shè)置參數(shù)GL_SOURCEi_ALPHA 和 GL_OPERANDi_ALPHA(其中i為0, 1, 2)的值.
參數(shù)target為GL_TEXTURE_ENV時(shí)參數(shù)pname和param的取值
pname?????????????? param
GL_TEXTURE_ENV_MODE?????? GL_DECAL, GL_REPLACE, GL_MODULATE, GL_BLEND, GL_ADD, GL_COMBINE
GL_TEXTURE_ENV_COLOR?????? 包括4個(gè)浮點(diǎn)數(shù)的數(shù)組, 表示分量R, G, B, A的值
GL_COMBINE_RGB?????????? GL_REPLACE, GL_MODULATE, GL_ADD, GL_ADD_SIGNED, GL_INTERPOLATE, GL_SUBTRACT, GL_DONT3_RGB, GL_DOT3_RGBA
GL_COMBINE_ALPHA?????? GL_REPLACE, GL_MODULATE, GL_ADD, GL_ADD_SIGNED, GL_INTERPOLATE, GL_SUBTRACT
GL_SOURCEi_RGB,
GL_SOURCEi_ALPHA?????? GL_TEXTURE, GL_TEXTUREEx, GL_CONSTANT, GL_PRIMARTY_COLOR, GL_PREVIOUS
GL_OPERANDi_RGB?????????? GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
GL_OPERANDi_ALPHA?????? GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
GL_RGB_SCALE?????????? 表示顏色分量縮放因子的浮點(diǎn)數(shù)
GL_ALPHA_SCALE?????????? 表示alpha分量縮放因子的浮點(diǎn)數(shù)
多重紋理, 不同的紋理單元中使用不同的組合函數(shù), 執(zhí)行步驟:
1) 使用合并函數(shù), 首先必須調(diào)用函數(shù)glTexEnvf()
?? glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
2) 指定如何組合RGB, alpha值
參數(shù)param的值?????????? 組合函數(shù)
GL_REPLACE?????????? Arg0
GL_MODULATE(默認(rèn))?????? Arg0 * Arg1
GL_ADD?????????????? Arg0 + Arg1
GL_ADD_SIGNED?????????? Arg0 + Arg1 - 0.5
GL_INTERPOLATE?????????? Arg0 * Arg2 + Arg1 * (1 - Arg2)
GL_SUBTRACT?????????? Arg0 - Arg1
GL_DOT3_RGB??
GL_DOT3_RGBA?????????? 4*((Arg0r - 0.5)*(Arg1r - 0.5) + (Arg0g - 0.5)*(Arg1g - 0.5) + (Arg0b - 0.5)*(Arg1b - 0.5))
注意: 只能將參數(shù)GL_COMBINE_RGB的值設(shè)置為GL_DOT3_RGB和GL_DOT3_RGBA, 而不能將GL_COMBINE_ALPHA設(shè)置為這樣的值.
組合函數(shù)GL_DOT3_RGB和GL_DOT3_RGBA之間的差別很小, 前者將R, G, B的值都設(shè)置為計(jì)算結(jié)果, 后者將R, G, B, A的值都設(shè)置為計(jì)算結(jié)果.
3)GL_SOURCEi_RGB來(lái)指定組合函數(shù)的第i個(gè)參數(shù)的來(lái)源, 例如: 組合函數(shù)GL_SUBTRACT需要兩個(gè)參數(shù).
指定組合函數(shù)的參數(shù)來(lái)源代碼:
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
參數(shù)pname為GL_SOURCEi_RGB時(shí), 參數(shù)param指定組合函數(shù)第i個(gè)參數(shù)的來(lái)源, 其可能取值如下:
GL_TEXTURE: 第i個(gè)參數(shù)來(lái)自當(dāng)前紋理單元中的紋理
GL_TEXTUREn: 第i個(gè)參數(shù)來(lái)自第n個(gè)紋理單元中的紋理
GL_CONSTANT: 使用GL_TEXTURE_ENV_COLOR設(shè)置的常量顏色
GL_PRIMARY_COLOR: 片元進(jìn)入紋理單元0時(shí)的顏色, 即片元最初的顏色.
GL_PREVIOUS: 前一個(gè)紋理單元輸出的片元顏色(對(duì)紋理單元0來(lái)說(shuō), 含義與GL_PRIMARY_COLOR相同)
4) 指定來(lái)源中的哪些值(RGB還是alpha), 以及如何使用它們.
GL_OPERAND/_RGB 指定如何使用來(lái)源GL_SOURCE/_RGB中的顏色值
GL_OPERAND/_ALPHA指定如何使用來(lái)源GL_SOURCEi_ALPHA中的ALPHA值
在RGB組合函數(shù)中使用alpha值的代碼
static GLfloat constColor[4] = { 0.1, 0.2, 0.3, 0.4 };
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constColor);
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
上例另Arg2的R,G,B分量都為0.4
5) (可選)設(shè)置RGB或alpha縮放因子. 默認(rèn)設(shè)置如下:
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0);
glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0);
6) 繪制幾何體, 確定其頂點(diǎn)有合適的紋理坐標(biāo)

插值組合函數(shù)

插值組合函數(shù)適合用于演示紋理組合函數(shù)的用法, 因?yàn)樗腥齻€(gè)參數(shù), 且支持多種指定來(lái)源和操作數(shù)的方式
插值組合函數(shù): combiner.c

/* 用作常量紋理顏色 */
static GLfloat constColor[4] = {0.0, 0.0, 0.0, 0.0};
constColor[3] = 0.2;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constColor);
glBindTexture(GL_TEXTURE_ENV, texName[0]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
/* 接下來(lái)渲染幾何體 */

一個(gè)活動(dòng)的紋理單元. 由于組合函數(shù)為GL_INTERPOLATE. 因此有三個(gè)參數(shù): 使用下述公式將這些參數(shù)組合起來(lái): Arg0 * Arg2 + Arg1 * (1 - Arg2)
Arg0: 來(lái)自GL_TEXTURE---與當(dāng)前綁定的紋理對(duì)象(texName[0])相關(guān)聯(lián)的紋理圖像.
Arg1: GL_PREVIOUS---前一個(gè)紋理單元的輸出. 由于當(dāng)前紋理單元0, 因此是片元最初的顏色值.
Arg2: GL_CONSTANT---常量顏色, 當(dāng)前為(0.0, 0.0, 0.0, 0.2);
插值結(jié)果為紋理圖像和片元的加權(quán)混合. 由于GL_OPERAND2_RGB被設(shè)置為GL_SRC_ALPHA, 因此常量顏色的alpha值被用于計(jì)算權(quán)重(Arg2)
上例, 程序?qū)?0%的紋理顏色和經(jīng)過(guò)平滑著色的多邊形顏色的80%混合起來(lái).

9.9 執(zhí)行紋理映射后應(yīng)用輔助顏色

執(zhí)行紋理映射后, 在計(jì)算霧效之前, 有時(shí)候可能將輔助顏色用于片元, 使得鏡面反射區(qū)域(highlight)顯得更真實(shí)

9.9.1 光照被禁用時(shí)的輔助顏色

光照被禁用,且顏色累積模式被啟用---使用glEnable()調(diào)用參數(shù)GL_COLOR_SUM. 把當(dāng)前的輔助顏色(由函數(shù)glSecondaryColor*()設(shè)置)與經(jīng)過(guò)紋理映射處理后的片元顏色相加.
void glSecondaryColor3(b s i f d ub us ui)(TYPE r, TYPE g, TYPE b);
void glSecondaryColor3(b s i f d ub us ui)v(const TYPE *values);

功能: 設(shè)置當(dāng)前輔助顏色的紅, 綠, 黃分量的值。

9.9.2 光照被啟用時(shí)的輔助鏡面反射顏色

注意: 如果光照被啟用, 則不管GL_COLOR_SUM模式是否被啟用, 都將應(yīng)用鏡面反射顏色, 并忽略函數(shù)glSecondaryColor*()設(shè)置的輔助顏色.

9.10 紋理矩陣堆棧


要修改當(dāng)前的紋理矩陣, 需要將矩陣模式設(shè)置為GL_TEXTURE, 如下所示

glMatrixMode(GL_TEXTURE);?? /* 進(jìn)入紋理矩陣模式 */
glRotated(...);
/* 其他矩陣操作 */
glMatrixMode(GL_MODELVIEW);?? /* 返回模型視圖模式 */

1. q坐標(biāo)
將紋理坐標(biāo)(s, t, r, q)乘以紋理矩陣后, 得到的向量(s', t', r', q')被視為齊次紋理坐標(biāo). 換句話說(shuō), 根據(jù)s'/q', t'/q', r'/q'在紋理圖像中查找紋素.
需要多種投影變換時(shí), 可以使用q坐標(biāo).

9.11 深度紋理

(1) 從光源的角度渲染場(chǎng)景. 不管場(chǎng)景如何, 你只需要深度值, 復(fù)制深度緩存中的值, 將其存儲(chǔ)到一個(gè)紋理圖中, 以創(chuàng)建一個(gè)陰影圖
(2) 生成紋理坐標(biāo), 其中(s, t)坐標(biāo)表示陰影圖中的位置, 第三個(gè)紋理坐標(biāo)r是距離光源的距離.
??? 再次繪制場(chǎng)景, 繪制時(shí)將r值同深度紋理值進(jìn)行比較, 以判斷片元被光源照射還是位于陰影中.

9.11.1 創(chuàng)建陰影圖

第一步是創(chuàng)建一個(gè)由深度值組成的紋理圖. 為此, 將視點(diǎn)放在光源處, 并渲染場(chǎng)景.
范例中: 調(diào)用函數(shù)glGetLightfv()來(lái)獲得當(dāng)前的光源位置, 然后計(jì)算向上向量, 并使用它來(lái)進(jìn)行視點(diǎn)變換.
??????? 視口的大小設(shè)置成與紋理圖相同, 然后, 設(shè)置合適的透視矩陣和視點(diǎn)矩陣, 渲染場(chǎng)景中的物體, 并將深度圖像復(fù)制到紋理內(nèi)存中,用作陰影圖.
??????? 最后, 將視口的位置和大小恢復(fù)到原來(lái)的設(shè)置.
1) 投影矩陣決定了燈罩的形狀. 函數(shù)gluPerspective()的參數(shù)lightFovy和lightAspect決定了燈罩的大小.lightFovy越小, 越接近于聚光燈. 其值越大, 越接近于泛光燈.
2) 光源的近裁剪面和遠(yuǎn)裁剪面用于控制深度值的準(zhǔn)確度. 近裁剪面和遠(yuǎn)裁剪面之間的距離越小, 深度值的準(zhǔn)確度越高.
3) 在深度緩存中建立深度值后, 需要復(fù)制它們, 并以內(nèi)部格式GL_DEPTH_COMPONENT將它們存儲(chǔ)到紋理圖中.
?? 范例使用函數(shù)glCopyTexImage2D()根據(jù)深度緩存的內(nèi)容創(chuàng)建了一個(gè)紋理圖像. 和其他紋理一樣, 紋理圖像的寬度和高度必須是2的冪

轉(zhuǎn)載于:https://www.cnblogs.com/mazhenyu/p/4798718.html

總結(jié)

以上是生活随笔為你收集整理的纹理映射 【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天堂av网手机版 | 成人av动漫在线 | 久久九九久精品国产免费直播 | 日韩a在线 | 超碰97色 | xxx老太太 | 黄网站免费大全入口 | 男女福利视频 | 国产美女精品视频 | 久久久性 | 欧洲自拍偷拍 | 一级视频在线免费观看 | 欧美视频在线观看一区 | 国产调教视频在线观看 | 最好看的中文字幕国语电影mv | 亚洲av综合色区无码另类小说 | www.久久久久久久 | 裸体黄色片 | 国产一区二区三区18 | 国产精品每日更新 | 国产成人99久久亚洲综合精品 | 久久久久久夜 | 亚洲综合色一区 | 久本草精品| 欧美日韩极品 | 亚洲 欧美 变态 另类 综合 | 国内精久久久久久久久久人 | 四虎免费影视 | 亚洲国产第一 | 成人黄色在线网站 | 国产sm主人调教女m视频 | 粉嫩小箩莉奶水四溅在线观看 | 久久入口 | 中文字幕免费在线视频 | 亚洲AV无码一区二区三区性 | 国产一区二区精品丝袜 | 国产精品一级视频 | 99一区二区三区 | 成人免费视频免费观看 | 亚洲乱码精品久久久久 | 亚洲高清欧美 | 五月天色站 | 一级黄色大片在线观看 | 国产精品va在线观看无码 | 欧美亚洲综合另类 | 午夜免费视频观看 | 亚洲国产精品视频一区二区 | 99精彩视频 | 欧美做受喷浆在线观看 | 亚洲一区二区三区四区不卡 | 少妇高潮视频 | 韩国美女视频在线观看18 | 国产综合免费视频 | 亚洲理论中文字幕 | 污视频免费在线观看 | 国产精品永久在线观看 | 中文字幕av一区二区三区 | 香蕉视频免费网站 | 午夜精品网 | av爱爱网站 | 在线免费观看小视频 | 就去色av| 毛片毛片毛片毛片毛片毛片毛片毛片 | 国产伦精品一区二区三区高清 | 国产黄色三级 | 日韩精品视频在线 | av一二三区| 日本欧美不卡 | av自拍偷拍 | 欧美激情动态图 | 久久久久久久久影院 | 色婷婷综合在线 | 日本嫩草影院 | 一区二区三区精品视频在线观看 | 欧美播放| 免费黄色小网站 | 欧美性猛交xxxx乱大交退制版 | 久久精品天堂 | 麻豆av在线免费观看 | 国产视频一区二区在线 | 都市激情国产精品 | 熟女高潮一区二区三区视频 | 国产av一区二区三区最新精品 | 99色综合网 | 动漫女被黄漫免费视频 | 秋霞福利网 | 亚洲精品一区二区三区区别 | 淫羞阁av导航 | 在线观看黄色大片 | 爱情岛论语亚洲入口 | 综合精品在线 | 男女做爰猛烈高潮描写 | 刘玥91精选国产在线观看 | 91人人爽 | 日韩区欧美区 | 人人妻人人澡人人爽欧美一区双 | 天堂网视频 | 无码国产精品一区二区免费式直播 | 日韩一区二区三区在线播放 |