OpenGL之自動紋理座標生成

2021-03-31 08:56:30 字數 2690 閱讀 7725

opengl中有兩種方法為頂點(vertex)指定紋理座標:

1.由人工給每個頂點分配座標。可以通過函式gltexcord*()來完成。

2.由opengl自動為每個頂點分配座標。這個任務由函式gltexgen*()來完成。

一開始,我對gltexgen*()這個函式並不是十分的理解,不知道opengl到底是怎樣自動生成紋理座標的。查閱了相關的資料,才開始有一點明白:要完成自動紋理座標的生成,首先要指定以什麼樣的模式(既什麼樣的演算法)來生成紋理座標。

在opengl1.1中,可以指定三種紋理座標生成模式:gl_object_linear, gl_eye_linear, gl_sphere_map,在opengl1.3中,又新增了兩種生成模式:gl_reflection_map,gl_normal_map.對這些模式的理解是使用gltexgen*()的關鍵,也決定了紋理貼圖後的效果。下面就分析這些模式的具體含義:

1.gl_object_linear

在這個模式下,其紋理生成函式是頂點座標(x0,y0,z0,w0)的線性組合:

生成的座標=p0*x0+p1*y0+p2*z0+p3*w0;

假如我們以(p0,p1,p2,p3)為引數構造乙個平面:p0*x+p1*y+p2*z+p3=0;

若(p0,p1,p2)已經被歸一化,則任何一點到這個平面的距離為:

(p0*x+p1*y+p2*z+p3)/sqrt(p0*p0+p1*p1+p2*p2)=p0*x+p1*y+p2*z+p3;

可以看出:此模式下生成的座標相當於頂點座標到特定平面的距離。

2.gl_eye_linear

在這個模式下,其紋理生成函式也是頂點的人眼座標(xe,ye,ze,we)的線性組合:

生成的座標=p0'*xe+p1'*ye+p2'*ze+p3'*we;

其中:(p0',p1',p2',p3')=(p0,p1,p2,p3)*inverse(m)

可以看出:gl_eye_linear和gl_object_linear模式具有類似的紋理生成函式,唯一的差別在於gl_object_linear是物體空間內,在視發生變化的情況下,紋理座標不會隨著視的改變而改變;而gl_eye_linear是在視空間內,在視發生變化的情況下,紋理座標會隨著視的改變而改變,用而改變貼圖後的效果。

3.gl_sphere_map

在這個模式下,其紋理座標生成演算法如下:

以u標識在視座標系下原點到頂點的乙個單位向量;

以n'標識在視座標系下頂點的法向量;

以r=trans(rx,ry,rz)標識頂點的反射向量,則t可以由以下公式計算得到:

r=u-2*trans(n')(n'u);

另m=2*sqrt(rx*rx+ry*ry+(rz+1)*(rz+1)),則生成的座標:

(s,t)=( rx/m+0.5, ry/m+0.5 );  //在這個情況下,指定r,q座標是非法的。

可以看出,這個模式是在平面上模擬了球面的反射效果。

3.gl_reflection_map

在這裡模式下,和gl_sphere_map一樣,首先計算頂點的反射向量,然後將此向量值作為相應的紋理座標:

(s,t,r)=(rx,ry,rz);            //在這個情況下,指定q座標是非法的

4.gl_normal_map

在這裡首先需要了解一些normal transformation的背景。

在進行光照運算之前,要將normal轉化到視座標系中,然後通過縮放(rescaling),歸一化(normalization)操作後轉化成單位向量:

設model-view矩陣是m, 通過下公式將頂點normal轉化到視座標系下:

(nx',ny',nz')=(nx,ny,nz)inverse(mu);

其中的mu是m的乙個左上角3×3矩陣。

然後經過縮放,歸一化後獲得乙個單位向量,用來光照運算。

在這個紋理生成模式下,將獲得的單位向量值作為相應的紋理座標:

(s,t,r)=(nfx,nfy,nfz);          //在這個情況下,指定q座標是非法的

下面舉幾個簡單的例子:

1.帶引數的情況,包括gl_object_linear,gl_eye_linear;

1.開啟開關,使能紋理座標自動生成:

glenable(texture_gen_s);    //texture_gen_s,textue_gen_r,texture_gen_q

2.設定模式:

gltexgeni(gl_s,gl_texture_env_mode,gl_object_linear);

3.設定引數:

glfloat params=;

gltexgenv(gl_s,gl_object_plane,params);

4.關閉開關

gldisable(texture_gen_s);

2.不帶引數的情況,包括gl_sphere_map,gl_reflection_map,gl_normal_map

1.開啟開關

glenable(texture_gen_s);    //texture_gen_s,textue_gen_r,texture_gen_q    

2.設定模式:

gltexgeni(gl_s,gl_texture_env_mode,gl_noraml_map);

3.關閉開關

gldisable(texture_gen_s);

參考文獻:

1. 2. opengl specification 1.3

OpenGL學習二十二 紋理座標自動生成

可以讓opengl自動生成紋理座標,而不是使用gltexcoord 函式顯示地分配紋理座標 void gltexgeni glenum coord,glenum pname,glint param coord pname param 或gl texture gen mode gl object li...

OpenGL自動計算頂點紋理座標

opengl中有兩種方法為頂點 vertex 指定紋理座標 1.由人工給每個頂點分配座標。可以通過函式gltexcord 來完成。2.由opengl自動為每個頂點分配座標。這個任務由函式gltexgen 來完成。一開始,我對gltexgen 這個函式並不是十分的理解,不知道opengl到底是怎樣自動...

紋理矩陣和自動生成紋理

glmatrixmode gl texture 將矩陣變換對應到紋理座標上,這個時候使用gltranslatef glrotatef,glscalef所對應的座標變化都對映到紋理座標上,也可以使用glmultimatrixf,直接進行座標變換,紋理的自動生成 glfloat s vector 4 g...