OpenGL自動計算頂點紋理座標

2021-04-18 05:08:36 字數 2779 閱讀 6549

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

自動計算頂點緩衝中所有頂點的法線

問題 當繪製自定義的結構時,你會發現光照不正確。這是因為你沒有指定正確的法線向量,顯示卡要求每個頂點都有法線資訊,這樣它才可以決定每個三角形獲得多少光照,詳細資訊可見第六章。為每個頂點計算法線向量看起來很複雜,因為大多數頂點被多個三角形共享。如果每個頂點只被乙個三角形使用,你只需找到三角形的法線向量...

自動計算頂點緩衝中所有頂點的法線

當繪製自定義的結構時,你會發現光照不正確。這是因為你沒有指定正確的法線向量,顯示卡要求每個頂點都有法線資訊,這樣它才可以決定每個三角形獲得多少光照,詳細資訊可見第六章。為每個頂點計算法線向量看起來很複雜,因為大多數頂點被多個三角形共享。如果每個頂點只被乙個三角形使用,你只需找到三角形的法線向量 換句...